Codeforces Round #484 (Div. 2), problem: (C) Cut 'em all! 【dfs】

题意

去除尽可能多的边,使得剩下的连通块里点的个数都为偶数

思路

n为奇数直接输出-1

偶数的话从一个点开始递归找节点的子节点的数目(包含本身),如果是偶数则可以直接去除,因为只有n-1个边,也就是说剩下的一定是一个偶数的连通块

最后我们需要减1,因为本身这棵树如果是偶数的话也会算进去一次

code

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=1e5+5;
vector<int> G[maxn];
int n;
int cnt;
int dfs(int u,int fa){
    int sum=1;
    for(auto v:G[u]){
        if(v==fa) continue;
        sum+=dfs(v,u);
    }
    if(sum%2==0) cnt++;
    return sum;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n-1;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    cnt=0;
    dfs(1,-1);
    if(n&1){
        cout<<-1<<endl;
        return 0;
    }
    cout<<cnt-1<<endl;
    return 0;
}
学如逆水行舟,不进则退
发布了470 篇原创文章 · 获赞 1150 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/104146365