Codeforces Round #628 (Div. 2) C

Posted pecoz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #628 (Div. 2) C相关的知识,希望对你有一定的参考价值。

原题
题意:给你N个点和N-1条边,每条边不相同,大小为 [ 0 , N-1 ] ,你要使任意两个节点构成的所有(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;
}

以上是关于Codeforces Round #628 (Div. 2) C的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #628 (Div. 2) B.CopyCopyCopyCopyCopy(Set)

Codeforces Round #628 (Div. 2) C

Codeforces Round #628 (Div. 2) F——Ehab's Last Theorem dfs

Codeforces Round #628 (Div. 2) D. Ehab the Xorcist(异或,思维题)

Codeforces Round #628 (Div. 2) C.Ehab and Path-etic MEXs(图论,思维题)

二进制构造Codeforces Round #628 (Div. 2) D. Ehab the Xorcist