• 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;
    }
    
    
    戒骄戒躁,百炼成钢!
  • 相关阅读:
    poj 3096 Surprising Strings (set)
    hdu 4038 stone
    STL set 使用总结
    poj 3185 The Water Bowls (bfs 加未压缩)
    QPixmap显示图片
    addStretch的作用 .
    Qt SizeHint()
    StyleSheet
    linux编程守护进程编写
    Qt样式表的使用
  • 原文地址:https://www.cnblogs.com/Pecoz/p/12505784.html
Copyright © 2020-2023  润新知