[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

题解-CF1307G Cow and Exercise

题解-CF1307G Cow and Exercise

CF785D Anton and School - 2(范德蒙德行列式卷积)

CF174 div1 B. Cow Program 记忆化搜索