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;
    }
  • 相关阅读:
    tomcat剖析(一)
    java内存区域
    经典排序算法-冒泡与选择
    使用docker安装mysql服务
    C语言博客作业--结构体
    C博客作业--指针
    C语言博客作业--字符数组
    C语言博客作业--数组
    C语言博客作业--数据类型
    C语言博客作业--函数
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10930317.html
Copyright © 2011-2022 走看看