hdu 5326 Work
2015-07-28 16:51
211 查看
Work
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
[align=left]Problem Description[/align]
It’s an interesting experience to move from ICPC to work, end my college life and start a brand new journey in company. As is known to all, every stuff in a company has a title, everyone except the boss has a direct leader, and all the relationship forms a tree. If A’s title is higher than B(A is the direct or indirect leader of B), we call it A manages B. Now, give you the relation of a company, can you calculate how many people manage k people.
[align=left]Input[/align]
There are multiple test cases. Each test case begins with two integers n and k, n indicates the number of stuff of the company. Each of the following n-1 lines has two integers A and B, means A is the direct leader of B. 1 <= n <= 100 , 0 <= k < n 1 <= A, B <= n
[align=left]Output[/align]
For each test case, output the answer as described above.
[align=left]Sample Input[/align]
7 2 1 2 1 3 2 4 2 5 3 6 3 7
Sample Output
2
拓扑排序确定每个结点的权值或者直接树的先序遍历
#include<cstring> #include<string> #include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<map> #include<cstdlib> #include<cmath> #include<vector> using namespace std; #define INF 0x3f3f3f3f int s[105]; int in[105]; int e_max; int fir[5005]; int u[5005],v[5005],nex[5005],w[5005]; inline void init() { e_max=0; memset(fir,-1,sizeof fir); memset(in,0,sizeof in); } inline void add_edge(int s,int t) { int e=e_max++; u[e]=s; v[e]=t; nex[e]=fir[u[e]]; fir[u[e]]=e; } int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { init(); memset(w,0,sizeof w); for(int i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); in[a]++; add_edge(b,a); } int left=n; int f=0,r=-1; int q[1050]; int vis[1050]; for(int i=1;i<=n;i++) { if(in[i]==0) { in[i]--; q[++r]=i; } } while(f<=r) { int k=q[f++]; for(int i=fir[k];~i;i=nex[i]) { int e=v[i]; in[e]--; w[e]+=w[k]+1; if(in[e]==0) { q[++r]=e; } } } int ans=0; for(int i=1;i<=n;i++) { if(w[i]==k) ans++; } printf("%d\n",ans); } return 0; }
#include<cstring> #include<string> #include<iostream> #include<queue> #include<cstdio> #include<algorithm> #include<map> #include<cstdlib> #include<cmath> #include<vector> using namespace std; #define INF 0x3f3f3f3f #define maxn 105 int n,m; int w[maxn]; bool vis[maxn]; int fir[maxn]; int u[maxn],v[maxn],nex[maxn]; int e_max; void init() { e_max=0; memset(fir,-1,sizeof fir); memset(w,0,sizeof w); memset(vis,false,sizeof vis); } void add_edge(int s,int t) { int e=e_max++; u[e]=s; v[e]=t; nex[e]=fir[u[e]]; fir[u[e]]=e; } void dfs(int k) { for(int i=fir[k];~i;i=nex[i]) { int e=v[i]; if(!vis[e]) { vis[e]=true; dfs(e); } w[k]+=w[e]+1; } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); add_edge(a,b); } int ans=0; for(int i=1;i<=n;i++) { if(!vis[i]) { dfs(i); vis[i]=true; } if(w[i]==m) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- android 图片三级缓存实现
- VMWare虚拟机提供的桥接、NAT和Host-only的区别
- redmine拉取svn的数据时总是报404错误的解决方法
- 野指针
- 页面刷新按钮
- Coursera台大机器学习技法课程笔记08-Adaptive Boosting
- IPC thread写法太晦涩
- HDOJ1978 How many ways【dp or 记忆化搜索】
- ffmpeg解码流程学习总结
- android屏幕自适应
- C语言32个关键字
- SZTextView 不能输入中文解决方法
- UVa10391 复合词
- PID算法完全讲解
- Android 颜色透明度
- 使用EasyUI实现文本框内容长度验证,对文本框输入内容提示“剩余可输入字数”
- 【进阶android】Volley源码分析——Volley的缓存
- java https连接
- 用Python解析XML的几种常见方法的介绍
- scala spark编程常见问题总结