Ksyusha and Chinchilla
题意:
给一颗树,你可以删除其中的边,问你能否通过删除边,使得这颗树变成若干个由三个点组成的块,如果可以输出删除边的编号,如果不可以输出-1.
思路:
深搜,返回的时候每遇到三个点就切一刀,如果返回的时候遇到大于3个点了,那就直接输出-1,像这种
.如果最后返回到根节点,点数不够3,也输出-1,
像这种
代码:
int n;
vector<pair<int, int>> g[maxn];
int d[maxn];
vector<int> ans;
int ok = 1;
void dfs(int u, int f, int id){
if(!ok) return;
d[u] = 1;
for(auto tem : g[u]){
int x = tem.first, y = tem.second;
if(x == f) continue;
dfs(x, u, y);
d[u] += d[x];
}
if(d[u] > 3) ok = 0;
if(d[u] == 3){
d[u] = 0;
ans.push_back(id);
}
}
void solve(){
cin >> n;
for(int i = 1; i <= n; i ++ ) g[i].clear();
for(int i = 1; i <= n - 1; i ++ ){
int u, v;
cin >> u >> v;
g[u].push_back({v, i});
g[v].push_back({u, i});
}
ok = 1;
ans.clear();
dfs(1, 1, 0);
if(!ok || d[1]) cout << -1 << endl;
else{
ans.pop_back();
cout << ans.size() << endl;
for(auto i : ans) cout << i << ' ';
cout << endl;
}
}