码迷,mamicode.com
首页 > 其他好文 > 详细

[cf1307D] Cow and Fields

时间:2020-05-05 23:19:50      阅读:86      评论:0      收藏:0      [点我收藏+]

标签: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;
}

[cf1307D] Cow and Fields

标签:cout   最大值   ++i   printf   数组   main   test   ORC   force   

原文地址:https://www.cnblogs.com/2inf/p/12833525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!