题意:
给定一棵树,有n个节点,现在为每个节点所在的边编号为0~n-2.问你怎样编号使得树上任意两点u,v的最大mex(u,v)值最小
mex(u,v)是指树上从u到v的一条简单路径上第一个没有出现的数字
假设这条路径有1,2,3,4 那么第一个没有出现的就是0
解析:
假如这棵树是一条链的话,随便排,全链路径的MEX一定为n−1
现在换成一棵树,如果存在某个节点度数>=3,选择和该节点相连的边依次赋值0,1,2,3…。这样就不可能存在其他路径同时经过0,1,2,3…但是无论怎么排列,一定存在一条路径经过0,1.所以所有路径的MEX的最小值一定为2。其他的随便排。
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=1e5;
vector<pair<int,int> > g[N];
int ans[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(make_pair(v,i));
g[v].push_back(make_pair(u,i));
}
int cnt=1;
for(int i=1;i<=n;i++)
{
if(g[i].size()>2)
{
for(auto j:g[i])
{
ans[j.y]=cnt++;
}
break;
}
}
for(int i=1;i<=n-1;i++)
{
if(ans[i]==0) ans[i]=cnt++;
cout<<ans[i]-1<<endl;
}
}