Codeforces - 1325C - Ehab and Path-etic MEXs(思维、树)
题目链接
题目大意:给你一棵树让你给每个结点编一个号,使得每一条从一个结点到另一个结点的路径中没有出现过的最小的数字最小。
1.如果一棵树是一条链的话,那么无论怎么编号,结果都是一样的。
2.如果一棵树不是一条链,那么必定存在一个结点的度数大于\(3\),那么通过这个结点的路径只能走所有与他相连的若干条边中的两条,那么我们将与这个结点相连其中\(3\)条边编号为0、1、2的话,那么经过这个结点的路中没有出现过的最小的数一定小于等于\(2\)。而对于没有经过这个结点的路径来说,最小值就是\(0\)。
const int maxn = 1e5+10;
vector<P> g;
int cnt[maxn], n;
int main(void) {
scanf("%d", &n);
for (int i = 0, u, v; i<n-1; ++i) {
scanf("%d%d", &u, &v);
g.push_back(P(u, v));
++cnt[u], ++cnt[v];
}
int num = 0, root = -1;
for (int i = 1; i<=n; ++i)
if (cnt[i]>=3) {
root = i;
num = cnt[i];
break;
}
for (int i = 0, num2 = 0; i<n-1; ++i) {
if (g[i].first!=root && g[i].second!=root) printf("%d\n", num++);
else printf("%d\n", num2++);
}
return 0;
}