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

戒骄戒躁,百炼成钢!
原文地址:https://www.cnblogs.com/Pecoz/p/12505784.html