[codeforces 1325C] Ehab and Path-etic MEXs 绕不开的叶节点+特判

Codeforces Round #628 (Div. 2)   比赛人数9400

[codeforces 1325C]  Ehab and Path-etic MEXs   绕不开的叶节点+特判

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

也在线测评地址https://codeforces.com/contest/1325/problem/C

Problem Lang Verdict Time Memory
C - Ehab and Path-etic MEXs GNU C++11 Accepted 77 ms 1000 KB

第三题就出现了树,让人有些紧张。

在寻找mex(u,v)的最大值过程中,发现出现最大值的情况,该路径一定包含了两个叶节点,mex(u,v)的值由不在路径中的边的最小值决定,发现,不在路径中的节点,一定有其它叶节点

考虑将包含叶节点的边依次从最小值开始设置,检验,确实能找到符合题意的数据。剩下没有连上叶节点的边,依次设置剩下的值。

叶节点特征,度为1.

该题,还需特判,只有两个节点的情形,

Input:
2
1 2
Output:
0

AC代码如下:

#include <stdio.h>
#include <string.h>
#define maxn 100010
int d[maxn],last[maxn],ans[maxn];
int main(){
	int n,u,v,i,cnt=0;
	scanf("%d",&n);
	if(n==2){//特判,只有两个节点
		printf("0\n");
		return 0;
	}
	for(i=1;i<=n-1;i++){//i对应边的处理
		scanf("%d%d",&u,&v);
		d[u]++,d[v]++;//找出叶节点
		last[u]=i,last[v]=i;//找出叶节点所在的边
	}
	memset(ans,-1,sizeof(ans));
	for(i=1;i<=n;i++)//i对应点的处理
		if(d[i]==1)ans[last[i]]=cnt++;//叶节点所在边设置
	for(i=1;i<=n-1;i++)//i对应边的处理
		if(ans[i]==-1)ans[i]=cnt++;//非叶节点边设置
	for(i=1;i<=n-1;i++)printf("%d\n",ans[i]);
	return 0;
}
发布了620 篇原创文章 · 获赞 550 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104875475