题目链接:点击打开链接
题目大意:有n个人。各自管理不同的人,问有多少人管理k个人。
思路:先记录每一个人的直接上级。然后模拟路径压缩的过程进行计数求和。
#include<stdio.h> #include<string.h> int p[105],sum[105]; void init() { int i; for(i=0;i<105;i++) { p[i]=i; sum[i]=1; } } void findroot(int x) { int r=x; while(r!=p[r]) r=p[r]; int i,j; i=x; while(i!=r) { j=p[i]; sum[p[i]]+=1; // p[i]=r; i=j; //模拟路径压缩过程,注意不要真的进行路径压缩。 } } int main() { int n,k,i,j,a,b; while(scanf("%d%d",&n,&k)!=EOF) { init(); for(i=1;i<n;i++) { scanf("%d%d",&a,&b); if(a!=b) p[b]=a; } for(i=1;i<=n;i++) { findroot(i); } int ans=0; for(i=1;i<=n;i++) { sum[i]--; //printf("%d\n",sum[i]); if(sum[i]==k)ans++; } printf("%d\n",ans); } return 0; }
时间: 2024-10-11 06:35:40