题意:
n个点 有n-1条边 去除最多的边 使得每个连通块点的个数为偶数
解析:
点的个数为奇数的时候肯定不行,输出-1
当为偶数时,随便选一个点作为根dfs搜一下 如果一个点的子树中点的个数为偶数 则断开和父结点的边即可 统计一共有多少个即可
为什么要是子树中点的个数。。。不从根开始统计。。。画画图就知道了
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+10, INF = 0x7fffffff; vector<int> G[maxn]; int vis[maxn]; int res[maxn], ans; void dfs(int u, int cnt) { vis[u] = 1; res[u] = 1; for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(vis[v]) continue; dfs(v, cnt+1); res[u] += res[v]; } if(!(res[u] & 1)) res[u] = 0, ans++; } int main() { int n, u, v; ans = 0; cin >> n; for(int i=0; i<n-1; i++) { cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } if(n & 1) return puts("-1"), 0; dfs(1, 1); cout<< ans - 1 <<endl; return 0; }