模拟求root——cf1067B
发布时间:2020-12-14 00:57:16 所属栏目:Linux 来源:网络整理
导读:?注意最后一轮要单独求一下 且最后只能有一个root #include bits/stdc++.h using namespace std; #define MOD 1000000007 #define ll long long int #define vi vectorint #define vii vector vectorint #define PI 3.1415926535897932384626433832795 #defi
?注意最后一轮要单独求一下 且最后只能有一个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 "n" 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |