zoukankan      html  css  js  c++  java
  • Cut 'em all! CodeForces

    题意:

      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;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    C# 从需要登录的网站上抓取数据
    mysql
    Fiddler抓取https设置详解(图文)
    Handlebars块级Helpers
    SQL优化技巧
    MyBatis持久层框架使用总结
    网页刷新页面方法小结
    史上最全的程序猿面试资料
    ActiveMQ开发与简介
    Lex使用指南
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9657976.html
Copyright © 2011-2022 走看看