Cut 'em all! CodeForces - 982C(贪心dfs)

题意:

  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;
}

 

posted @ 2018-09-16 22:59  WTSRUVF  阅读(198)  评论(0编辑  收藏  举报