首页 > 其他分享 >Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)

Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)

时间:2023-10-14 20:45:44浏览次数:35  
标签:903 Distance int Codeforces bfs push d2 d3 d1

Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance

思路

对标记点更新fg,从0开始进行bfs,更新d1为所有点到0的距离

获得到0最远的标记点L,从L开始bfs,更新d2为所有点到L的距离

获得距离L最远的标记点R,从R开始bfs,更新d3为所有点到R的距离

遍历所有点,这个点与标记点的最大距离一定为与L或R的距离

dis[i] = max ( d1[i] , d2[i] )

获得所有点的最小dis即可

#define int long long
#define ld long double

using namespace std;

int t;
queue<int>q;

void op()
{
	int n, k;
	cin >> n >> k;

	vector<bool>fg(n, 0);

	for (int i = 0; i < k; i++)
	{
		int x;
		cin >> x;
		fg[x - 1] = 1;
	}

	vector<vector<int>>head(n);

	for (int i = 0; i < n - 1; i++)
	{
		int u, v;
		cin >> u >> v;
		head[u-1].push_back(v-1);
		head[v-1].push_back(u-1);
	}
//bfs,d1为1到点的距离
	vector<int>d1(n, -1);

	q.push(0);

	d1[0] = 0;

	while (q.size())
	{
		int x = q.front();
		q.pop();
		for (auto y : head[x])
		{
			if (d1[y] != -1)continue;
			d1[y] = d1[x] + 1;
			q.push(y);
		}
	}
//
	int L = 0, maxn1 = -1;
	for (int i = 0; i < n; i++)
	{
		if (!fg[i])continue;
		if (d1[i] > maxn1)
		{
			L = i;
			maxn1 = d1[i];
		}
	}

//bfs,d2为点到L的距离
	vector<int>d2(n, -1);

	q.push(L);

	d2[L] = 0;

	while (q.size())
	{
		int x = q.front();
		q.pop();
		for (auto y : head[x])
		{
			if (d2[y] != -1)continue;
			d2[y] = d2[x] + 1;
			q.push(y);
		}
	}
//
	int R = 0, maxn2 = -1;
	for (int i = 0; i < n; i++)
	{
		if (!fg[i])continue;
		if (d2[i] > maxn2)
		{
			maxn2 = d2[i];
			R = i;
		}
	}

//bfs,d3为点到R的距离
	vector<int>d3(n, -1);

	q.push(R);

	d3[R] = 0;

	while (q.size())
	{
		int x = q.front();
		q.pop();
		for (auto y : head[x])
		{
			if (d3[y] != -1)continue;
			d3[y] = d3[x] + 1;
			q.push(y);
		}
	}
//
	vector<int>dis(n, -1);
	for (int i = 0; i < n; i++)
	{
		dis[i] = max(d2[i], d3[i]);
	}
	int minn = 0x3f3f3f3f;
	for(int i = 0; i < n; i++)
	{
		minn = min(minn, dis[i]);
	}
	cout << minn << endl;
}

signed main()
{
	cin >> t;
	while (t--)
	{
		op();
	}

	return 0;
}

标签:903,Distance,int,Codeforces,bfs,push,d2,d3,d1
From: https://www.cnblogs.com/ikunhuaji/p/17764690.html

相关文章

  • CodeForces 1886E I Wanna be the Team Leader
    洛谷传送门CF传送门把题意抽象成,给你长为\(n\)的序列\(a\)和长为\(m\)的序列\(b\),初始有\(m\)个空集合(可重集),\(a\)中的每个元素至多被分到\(m\)个集合中的一个。要求最后第\(i\)个集合\(T_i\)不为空,且\(\forallx\inT_i,x\ge\frac{b_i}{|T|}\)。要求构造......
  • Codeforces Round 671 (Div. 2) A. Digit Game
    \(R\)和\(B\)在玩一个数字游戏,给一个含有\(n\)位的正整数\(x\)。俩人轮流操作,\(R\)先行动。在每一步中,\(R\)可以选择\(x\)中一个未被标记的奇数位置并标记,\(B\)可以选择\(x\)中一个未被标记的偶数位置并标记。当最后只剩下一个未被标记的位置时,让这个数为\(m\)......
  • Codeforces Round 748 (Div. 3) B. Make it Divisible by 25
    给一个正整数\(n\),在一步操作中可以移除\(n\)中的一个。当\(n\)只剩下一位时将不能再操作,如果过程中产生了前导\(0\),则会被自动移除且不耗费操作次数。询问最少需要多少次操作可以使得\(n\)被\(25\)整除。显然一个正整数\(x\)若可以被\(25\)整除,只需要考虑最后......
  • Educational Codeforces Round 116 (Rated for Div. 2) A. AB Balance
    给一个长为\(n\)的字符串\(s\),只包含\(0\)\(1\)两种字符。定义\(AB(s)\)是\(s\)中出现的\(01\)子串个数,\(BA(s)\)是\(s\)中出现的\(10\)子串个数。在一步操作中,可以选择一个字符进行异或。询问最小的操作次数使得\(AB(s)=BA(s)\)。显然连续的\(11\)或连......
  • Codeforces Round 903 (Div. 3) E. Block Sequence(DP)
    CodeforcesRound903(Div.3)E.BlockSequence思路:设dp[i]为当i~n为完美的最少删除次数dp[n]=1,dp[n+1]=0;从后至前对于dp[i]更新若直接删除当前点,则为dp[i+1]+1若不删除则为min(dp[i+a[i]+1],dp[i]);i+a[i]+1为a[i]不能覆盖的位置#defineintlonglong#define......
  • Codeforces Round 903 (Div. 3)
    D题被hack了哭了第一题简单的只用把字符串重复的同时尝试匹配,然后判断就好了,只是需要一点代码能力第二题,也很简单最多剪断3次,就先从小到大排序,然后用最小的,看看大的是他的几倍,如果不是几倍的关系就不可能完成,如果是就算要几次就好了第三题,也很简单,很明显,对于一个格子,在它旋转9......
  • Codeforces Round 674 (Div. 3) B. Symmetric Matrix
    有\(n\)块\(2\times2\)的瓷砖,瓷砖上的每个方格包含一个数字,每种瓷砖都有无数种。现在需要用所给瓷砖构造一个\(m\timesm\)的方形矩阵\(a\)满足:每块瓷砖都在方形矩阵内瓷砖之间不能存在覆盖\(a_{i,j}=a_{j,i}\)。输出是否存在这种构造。一:显然合法的\(m\)......
  • Codeforces Round 903 (Div. 3)
    D.DivideandEqualize思路:1.某个数除以x,某个数再乘以x,可发现数组总的乘积没有变化2.也就是说,要使数组中的每一个元素相同,它们总的质因子应该满足:某个质因子的数量%n==0E.BlockSequence简单的dpdp[i],表示删除这个数字后的最小删除次数可以正的枚举,也可以倒着来转移方程......
  • Codeforces Global Round 11 A. Avoiding Zero
    给一个大小为\(n\)的数组\(a_1,a_2,\cdots,a_n\)。你需要构造一个大小为\(n\)的数组\(b\)且满足以下条件:数组\(b\)是数组\(a\)的冲排列对于\(\forallk=1,2,\cdots,n\),\(\sum_{i=1}^{k}b_i\neq0\)。输出任意一组构造,或者回答不可能。若\(\sum_{i......
  • Educational Codeforces Round 96 (Rated for Div. 2) A. Number of Apartments
    有三种建筑:三室厅、五室厅、七室厅。每个房间严格有一扇窗户。现在有\(n\)扇窗户,询问完全用完这些窗户的情况下,\(3,5,7\)室厅各有多少间。输出任意一种答案,或者回答不可能。假设一定有解,显然可以选择\(mod\)任意一个数贪心,不妨选最小的\(3\)。假设答案为\(a,b,c\):......