首页 > 其他 > 详细

Codeforces Round #628 (Div. 2) C

时间:2020-03-16 19:28:00      阅读:57      评论:0      收藏:0      [点我收藏+]

原题
题意:给你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

原文:https://www.cnblogs.com/Pecoz/p/12505784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!