[cf1307D] Cow and Fields
Posted 2inf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[cf1307D] Cow and Fields相关的知识,希望对你有一定的参考价值。
题意
??给出(n)个点(m)条边的无向图与(k)个特殊点,要在两个特殊点间添加一条边,求从(1)到(n)最短路的最大值。
题解
??(p_i)表示从(1)出发到(i)的最短路,(q_i)表示从(n)出发到(i)的最短路。选择两个特殊点(a)和(b)使(min(p_a+q_b+1,q_a+p_b+1))最大,不失一般性,假设(p_a+q_ble q_a+p_b),可以通过对(p_a-q_a)排序实现。遍历(k)个特殊点,遍历(t)时,更新答案(ans)为(min(ans,maxn+q_t+1)),其中(maxn)记录(1sim t)数组(p)的最大值。
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cout << #x << " is " << x << endl
#define inc(i, a, b) for (int i = a; i <= b; ++i)
typedef long long ll;
const int N = 2e5 + 5, INF = 2e9;
int n, m, k;
int a[N], p[N], q[N];
vector<int> G[N];
void bfs(int s, int* d) {
queue<int> q;
fill(d + 1, d + n + 1, INF);
q.push(s); d[s] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
for (auto v : G[u]) {
if (d[v] > d[u] + 1) {
d[v] = d[u] + 1;
q.push(v);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
inc(i, 1, k) cin >> a[i];
inc(i, 1, m) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
bfs(1, p);
bfs(n, q);
sort(a + 1, a + k + 1, [](int x, int y) {
return p[x] - p[y] < q[x] - q[y];
});
int maxn = p[a[1]], ans = 0;
inc(i, 2, k) {
ans = max(ans, maxn + q[a[i]] + 1);
maxn = max(maxn, p[a[i]]);
}
printf("%d
", min(ans, p[n]));
return 0;
}
以上是关于[cf1307D] Cow and Fields的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces1307D. Cow and Fields
Codeforces Round #621 (Div. 1 + Div. 2).D. Cow and Fields