YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MMP,差一点就做对了。

题目大意:给你一个树,对这个树的边进行编号,编号要求从0到n-1,不可重复,要求MEX(U,V)尽可能的小,

MEX(x,y)的定义:从x到y的简单路径上,没有出现的最小编号。

题解:

只要让0,1,2这三个号不在同一条路径上就行。

如果说是一条没有分支的树,那么无论怎么编号,MEX等于n-1。对于有分支的树,只要让他的叶子节点所连的边从小到大编号就行。。注意无向图求叶子节点的方法。。。。

度数那一步弄错了。。。

注意对小于2的树特判一下,就一条边,也就是0喽。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int arr[N];
int inv[N];
int mark[N];
struct stu {
    int x,y;
}pre[N];
int main(){
    int n;
    cin>>n;
    
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        pre[i]={x,y};
        inv[x]++;
        inv[y]++;
    }
    if(n==2) {
        cout<<0<<endl;
        return 0;
    }
    int pos=0;
    for(int i=1;i<=n;i++){
        if(inv[i]==1) {
            mark[i]=pos++;
        }
    }
    for(int i=1;i<n;i++){
        if(inv[pre[i].x]==1) cout<<mark[pre[i].x]<<endl;
        else if(inv[pre[i].y]==1) cout<<mark[pre[i].y]<<endl;
        else cout<<pos++<<endl;
    }
    return 0;
}

 

posted on 2020-03-17 16:38  Target--fly  阅读(117)  评论(0编辑  收藏  举报