标签:cout 最大值 ++i printf 数组 main test ORC force
??给出\(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_b\le q_a+p_b\),可以通过对\(p_a-q_a\)排序实现。遍历\(k\)个特殊点,遍历\(t\)时,更新答案\(ans\)为\(\min(ans,maxn+q_t+1)\),其中\(maxn\)记录\(1\sim 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\n", min(ans, p[n]));
return 0;
}
标签:cout 最大值 ++i printf 数组 main test ORC force
原文地址:https://www.cnblogs.com/2inf/p/12833525.html