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;
}