1. 程式人生 > >Multihedgehog(多叉樹找root)

Multihedgehog(多叉樹找root)

題意:

K層樹定義:上面K層節點都有至少三個兒子,第K+1層全是葉子。給出一棵樹結構和K,問這棵樹是不是K叉(不知道root)

解析:

首先是dfs得出每個節點的度,度為1的是葉子。然後葉子開始一層一層往上剪,直到剩下一個節點便是root

找root的時候可以當成是K叉,因為如果有root,就是跑出來的這個;如果沒有,跑出來的是什麼都會被check刷掉

然後從root往下dfs,判斷所有葉子是不是同一層,每個節點是不是有至少三個兒子

#include<bits/stdc++.h>
using namespace std;

int head[100009],nex[200009],to[200009];
int now; int de[100009]; int n=100000; void add(int a,int b){ nex[++now]=head[a];head[a]=now;to[now]=b; } void getDegree(int p,int fa){ if(fa!=0)de[p]=1; for(int i=head[p];~i;i=nex[i]){ if(to[i]==fa)continue; de[p]++; getDegree(to[i],p); } } int root; bool vis[100009]; void
getRoot(){ queue<int>p[2];int f=0; for(int i=1;i<=n;i++){ if(de[i]==1)p[f].push(i),vis[i]=1; } while(1){ while(!p[f].empty()){ int e=p[f].front();p[f].pop(); for(int i=head[e];~i;i=nex[i]){ if(vis[to[i]])continue; vis[
to[i]]=1; p[!f].push(to[i]); } } f=!f; if(p[f].size()<=1){ if(p[f].size()==1)root=p[f].front(); else root=-1; break; } } } int yes=1; int deep=-1; void check(int p,int fa,int v){ if(de[p]==1){ if(deep==-1)deep=v; else if(deep!=v)yes=0; return; } int ct=0; for(int i=head[p];~i;i=nex[i]){ if(to[i]==fa)continue; ct++; check(to[i],p,v+1); } if(ct<3)yes=0; } int main() { memset(head,-1,sizeof(head)); int k;scanf("%d%d",&n,&k); for(int i=2;i<=n;i++){ int a,b;scanf("%d%d",&a,&b); add(a,b);add(b,a); } getDegree(1,0); getRoot(); if(root==-1)return 0*printf("No\n"); check(root,0,0); if(yes&&deep==k)printf("Yes\n"); else printf("No\n"); }