题目描述:
你得到了一颗包含n个节点的树。要在树的边缘上写入一些标签,以便满足以下条件:
- 每个标签都是0到n-2之间的整数
- 所有书写的标签都是不同的
- 在任意节点对(u,v)上最大MEX(u,v) 尽可能的小
MEX(u,v)表示从节点u到节点v的唯一简单路径上任何边上未写入的最小非负整数。
输出每条边赋的值。
解题思路:
- 若没有节点度数大于等于3,即为一条链,任意赋值对最大MEX无影响
- 若存在节点度数大于等于3(不为链),三个出边分别赋值0,1,2,剩下的随便赋值,所有路径都不会同时经过0 1 2这三条边,所以mex最大值就是2最小
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100005],u[100005],v[100005];
int main()
{
int n,loc=0;cin>>n;
for(int i=1;i<n;++i)
{
cin>>u[i]>>v[i];
a[u[i]]++;a[v[i]]++;
}
for(int i=1;i<=n;i++)
if(a[i]>=3){
loc=i;
break;
}
if(loc==0)
for(int i=0;i<=n-2;++i)
cout<<i<<endl;
else
{
int t=3,ant=0;
for(int i=1;i<n;++i)
{
if((loc==u[i]||loc==v[i])&&ant<3)
{
cout<<ant<<endl;ant++;
}
else{
cout<<t<<endl;t++;
}
}
}
}