#include using namespace std; typedef pair P; const int maxn = 200000 + 5; int n; vector
edge[maxn]; vector a[maxn]; int res; void dfs(int u, int past, int day){ int now = 0; for (int i = 0; i < edge[u].size(); i++){ int v = edge[u][i].first; if (v == past) continue; int road = edge[u][i].second; now++; if (now == day) now++; res = max(now, res); dfs(v, u, now); a[now].push_back(road); } } int main(){ scanf("%d", &n); for (int i = 1; i < n; i++){ int a, b; scanf("%d %d", &a, &b); edge[a].push_back(make_pair(b, i)); edge[b].push_back(make_pair(a, i)); } dfs(1, 0, 0); printf("%d\n", res); for (int i = 1; i <= res; i++){ int l = a[i].size(); printf("%d ", l); for (int j = 0; j < l; j++){ printf("%d%c", a[i][j], j == l-1 ? '\n' : ' '); } } return 0; }
CF 638 dfs
http://codeforces.com/contest/638/problem/C
题目大意:
n个城市,n-1条损坏道路,两个城市要一起修同一条道路才能修复,期间不能再去修改其他的道路,问,最多需要几天
先输出总天数。再先输出该天数所要修复的道路的个数,再输出道路的编号
思路:
反正是树,dfs一下就好了。只要注意下天数就行。