标签:
1 10 2 0 1 0 2 0 3 1 4 1 5 2 6 3 7 4 8 6 9
2
大意:
n个接点从0~n。n-1中关系,问到0节点距离大于k的节点数。
1 #include<cstdio> 2 int n,b,a,k,fa[100000],i,ans; 3 int find(int a) //只查询不压缩 4 { 5 int r=a; 6 while(r != fa[r]) 7 { 8 r=fa[r]; 9 } 10 return r; 11 } 12 int f1(int a) //深度搜索 13 { 14 int s=0; 15 while(a != fa[a]) 16 { 17 a=fa[a]; 18 s++; //s表示到0节点的距离 19 } 20 return s; 21 } 22 int main() 23 { 24 int t; 25 scanf("%d",&t); 26 while(t--) 27 { 28 scanf("%d %d",&n,&k); 29 for(i = 0 ; i < n ;i++) 30 { 31 fa[i]=i; 32 } 33 for(i = 1 ; i < n ;i++) 34 { 35 scanf("%d %d",&a,&b); 36 if(a>b) //令大的数为小的数的子节点 37 { 38 fa[a]=b; 39 } 40 else 41 { 42 fa[b]=a; 43 } 44 } 45 ans=0; 46 for(i = n-1 ; i >= 0 ; i--) //从最大的数开始找(数大的节点在树的下面 ) 47 { 48 if(find(i) == 0) 49 { 50 if(f1(i) > k) 51 { 52 ans++; 53 } 54 } 55 } 56 printf("%d\n",ans); 57 } 58 }
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5727404.html