「C

题目链接

http://codeforces.com/contest/1325/problem/C

大意

给一颗树,有 n nn 个顶点,给这个树的边分别编号为 0 (n−2) 0~(n-2)0 (n−2),问怎样编使得对于树上任意两点 u,v u,vu,v 的最大 mex(u,v) mex(u,v)mex(u,v) 值最小。mex(u,v) mex(u,v)mex(u,v) 表示由 u uu 到 v vv 点的简单路径的长度构成的集合中,没有出现的最小非负整数。

做法分析

其实就是找到一个点,这个点与至少三个边相连,然后分别把这三个边定义为0,1,2;即可此时无论怎么连,都无法同时包括这三个数,也就是说必定最终要取其中一个。其他边随便赋值即可。

#include<bits/stdc++.h>
using namespace std;
struct tree{
    int u,v,va;
}s[100005];
int du[100005];int check=0;
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n-1;i++){
        cin>>s[i].u>>s[i].v;
        du[s[i].u]++;
        du[s[i].v]++;
        if(du[s[i].u]>=3)
            check=s[i].u;
        if(du[s[i].v]>=3)
            check=s[i].v;
    }
    int res=3,tem=0;
    if(check==0)res=0;
    for(int i=0;i<n-1;i++){
        if((s[i].u==check||s[i].v==check)&&tem<=2){
            cout<<tem<<endl;tem++;
        } 
        else{
            cout<<res<<endl;res++;
        }
    }
} 
rush!
原文地址:https://www.cnblogs.com/LH2000/p/12501146.html