# Ehab and Path-etic MEXs CodeForces - 1325C（思维+贪心）

You are given a tree consisting of n nodes. You want to write some labels on the tree’s edges such that the following conditions hold:

Every label is an integer between 0 and n−2 inclusive.
All the written labels are distinct.
The largest value among MEX(u,v) over all pairs of nodes (u,v) is as small as possible.
Here, MEX(u,v) denotes the smallest non-negative integer that isn’t written on any edge on the unique simple path from node u to node v.

Input
The first line contains the integer n (2≤n≤105) — the number of nodes in the tree.

Each of the next n−1 lines contains two space-separated integers u and v (1≤u,v≤n) that mean there’s an edge between nodes u and v. It’s guaranteed that the given graph is a tree.

Output
Output n−1 integers. The ith of them will be the number written on the ith edge (in the input order).

Examples
Input
3
1 2
1 3
Output
0
1
Input
6
1 2
1 3
2 4
2 5
5 6
Output
0
3
2
4
1
Note
The tree from the second sample:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=1e5+100;
struct node{
int x,y;
}p[maxx];
vector<int> v[maxx];
int n;

inline void init()
{
for(int i=1;i<=n;i++) v[i].clear();
}
int main()
{
scanf("%d",&n);
init();
for(int i=1;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
v[p[i].x].push_back(p[i].y);
v[p[i].y].push_back(p[i].x);
}
map<pair<int,int>,int> mp;
mp.clear();
int cnt=0;
for(int i=1;i<=n;i++)
{
if(v[i].size()>=3)
{
for(int j=0;j<3;j++) mp[make_pair(i,v[i][j])]=++cnt;
break;
}
}
for(int i=1;i<n;i++)
{
if(mp[make_pair(p[i].x,p[i].y)]) cout<<mp[make_pair(p[i].x,p[i].y)]-1<<endl;
else if(mp[make_pair(p[i].y,p[i].x)]) cout<<mp[make_pair(p[i].y,p[i].x)]-1<<endl;
else cout<<cnt++<<endl;
}
return 0;
}


©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客