zoukankan      html  css  js  c++  java
  • 模拟求root——cf1067B

     注意最后一轮要单独求一下

    且最后只能有一个root

    #include <bits/stdc++.h>
    using namespace std;
    
    #define MOD 1000000007
    #define ll long long int
    #define vi vector<int>
    #define vii vector< vector<int> >
    #define PI 3.1415926535897932384626433832795
    #define INF 9223372036854775807LL
    #define endl "
    "
    
    int deg[100005];
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(NULL);
        int n,k;
        cin >> n >> k;
        vii graph(n+1,vi());
        vector<bool> rem(n+1,false);
        for(int i = 0; i < n-1; i++) {
            int a,b;
            cin >> a >> b;
            graph[a].push_back(b);
            graph[b].push_back(a);
        }
        if(k > 11) {
            cout << "No";
            return 0;
        }
        while(k > 1) {
            for(int i = 1; i <= n; i++) {//扫一遍剩下的图,求度数 
                if(!rem[i]) {
                    for(int u : graph[i]) {
                        if(!rem[u]) {
                            deg[i]++;
                        }
                    }
                }
            }
            for(int i = 1; i <= n; i++) {//扫一遍剩余结点 
                if(!rem[i]) {
                    int leafcn = 0;
                    for(int u : graph[i]) {
                        if(!rem[u] && deg[u] == 1) {//找到了新的叶子 
                            leafcn++;
                        }
                    }
                    if(leafcn < 3 && leafcn != 0) {//u有儿子且小于3 
                        cout << "No";
                        return 0;
                    }
                }
            }
            for(int i = 1; i <= n; i++) {//把叶子删了 
                if(!rem[i] && deg[i] == 1) {
                    rem[i] = true;
                }
            }
            memset(deg,0,sizeof(deg));
            k--;
        }
        
        int cn = 0;
        int cnb = 0;
        for(int i = 1; i <= n; i++) {//最后还要再求一次 
            if(!rem[i]) {
                cn++;
                for(int u : graph[i]) {
                    if(!rem[u]) {
                        deg[i]++;
                    }
                }
                if(deg[i] != 1) {
                    cnb++;
                }
            }
        }
        if(cn < 4 || cnb != 1) {
            cout << "No";
        } else {
            cout << "Yes";
        }
        return 0;
    }
  • 相关阅读:
    转_前端开发技术概要
    获取链接的参数
    tabIndex 主要是美化tab键切换的体现
    textarea自动增高并隐藏滚动条
    Zen Coding:css,html缩写替换大观让你的html,css飞起来
    动态添加链接颜色代码
    转javascript 数组
    为指定元素增加样式
    1 CodeBox代码盒子 alpha版发布
    转发布js支持Firefox的加入收藏代码
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10930317.html
Copyright © 2011-2022 走看看