Codeforces Round #628 (Div. 2) C
原题
题意:给你N个点和N-1条边,每条边不相同,大小为 [ 0 , N-2 ]的整数 ,你要使任意两个节点构成的所有(u,v)的MEX(u,v)的最大值尽可能小 ,MEX(u,v)表示从节点u到节点v的唯一简单路径上没有写在任何边上的最小非负整数(即不等于任何u 到 v 所经过的边的权值的最小自然数)。
本题题意有点绕,我们要找最小值,就要从0这个最小的数入手,我们只要不让一条路径上的各个边从0开始连续,就能让MEX(u,v)尽可能小。如果一条路径只经过一条边,那么MEX(u,v)一定是0,如果不止一条,我们知道0,1,2至少两两之间一定在一条链上,根据不要从0开始连续的思想,我们可以让权值为0,1,2的三条边两两在同一条路径上,这样我们就可以保证最大值一定是2。即我们只要找到一个度大于等于3的点,把0,1,2分别放在他其中的三条边中即可。
而如果该图是一条链的话,无论怎么排,0,1,2都在一起,最小值一定是N-1。
#include<bits/stdc++.h>
using namespace std;
struct p
{
int x,y;
}v[100005];
int c[100005];
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
cin>>v[i].x>>v[i].y;
c[v[i].x]++;
c[v[i].y]++;
}
int a=0,b=n-2,pos=0;
for(int i=1;i<=n;i++)
{
if(c[i]>=3)
{
pos=i;
break;
}
}
for(int i=1;i<n;i++)
{
if(v[i].x==pos||v[i].y==pos)
cout<<a++;//三条边从零开始赋
else
cout<<b--;//其实其他边怎么弄都无所谓,只要保证[0,N-2]每个数都用到就好了,这从N-2开始是因为这样 a+b 始终等于N-2,不会遗漏
puts("");
}
return 0;
}
戒骄戒躁,百炼成钢!