hdu(5326)——Work
2015-09-05 10:12
411 查看
题意:
现在有一个有n个人的公司,然后每个人除了boss外都有一个直接领导者,然后如果是直接或间接领导的话,那么都可以说是A管理了B。然后问你有多少个人管理着k个人。
思路:
1)第一种方法:
我一开始就想到的是并查集,但是这里并不仅仅是简单的并查集。我们需要保存下来每个人与其他人的关系,要不然的话,我们无法直接合并(因为这里是有方向的)。
所以我们记vis[x][y]为x是y的领导。然后三层for更新每个人之间的关系。
2)第二种方法:
就是保存每个点对应的边,然后dfs一遍去查找那个点对应的管理的人员有几个。然后每次判断完,然后再输出。
//感觉第二种方法还是比较好想到的。
现在有一个有n个人的公司,然后每个人除了boss外都有一个直接领导者,然后如果是直接或间接领导的话,那么都可以说是A管理了B。然后问你有多少个人管理着k个人。
思路:
1)第一种方法:
我一开始就想到的是并查集,但是这里并不仅仅是简单的并查集。我们需要保存下来每个人与其他人的关系,要不然的话,我们无法直接合并(因为这里是有方向的)。
所以我们记vis[x][y]为x是y的领导。然后三层for更新每个人之间的关系。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define maxn 111 int par[maxn],num[maxn],a[maxn],b[maxn]; int vis[maxn][maxn]; int n,k; void init(){ <span style="white-space:pre"> </span>for(int i=1;i<=n;i++){ <span style="white-space:pre"> </span>par[i]=i; <span style="white-space:pre"> </span>num[i]=0; <span style="white-space:pre"> </span>} } int find(int x){ <span style="white-space:pre"> </span>if(par[x]==x) return par[x]; <span style="white-space:pre"> </span>else par[x]=find(par[x]); } void merge(int x,int y){ <span style="white-space:pre"> </span>int tx=find(x); <span style="white-space:pre"> </span>int ty=find(y); <span style="white-space:pre"> </span>if(tx!=ty){ <span style="white-space:pre"> </span>par[ty]=tx; <span style="white-space:pre"> </span>} } int main(){ <span style="white-space:pre"> </span>while(~scanf("%d%d",&n,&k)){ <span style="white-space:pre"> </span>init(); <span style="white-space:pre"> </span>memset(vis,0,sizeof(vis)); <span style="white-space:pre"> </span>for(int i=1;i<n;i++){ <span style="white-space:pre"> </span>scanf("%d%d",&a[i],&b[i]); <span style="white-space:pre"> </span>merge(a[i],b[i]); <span style="white-space:pre"> </span>vis[a[i]][b[i]]=1; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>for(int i=1;i<=n;i++){ <span style="white-space:pre"> </span>for(int j=1;j<=n;j++){ <span style="white-space:pre"> </span>for(int l=1;l<=n;l++){ <span style="white-space:pre"> </span>if(vis[i][l]&&vis[l][j]){ <span style="white-space:pre"> </span>vis[i][j]=1; <span style="white-space:pre"> </span>merge(i,j);<span style="white-space:pre"> </span>//一开始我写的是不对的,因为每次都要合并 <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>for(int i=1;i<=n;i++){ <span style="white-space:pre"> </span>for(int j=1;j<=n;j++){ <span style="white-space:pre"> </span>if(i!=j&&par[i]==par[j]&&vis[i][j]){ <span style="white-space:pre"> </span>num[i]++; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>int ans=0; <span style="white-space:pre"> </span>for(int i=1;i<=n;i++){ <span style="white-space:pre"> </span>if(num[i]==k) ans++; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>printf("%d\n",ans); <span style="white-space:pre"> </span>} } /* 7 2 1 2 1 3 2 4 2 5 3 6 3 7 */
2)第二种方法:
就是保存每个点对应的边,然后dfs一遍去查找那个点对应的管理的人员有几个。然后每次判断完,然后再输出。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<vector> using namespace std; #define maxn 111 vector<int> G[maxn]; int n,res; int vis[maxn]; void dfs(int v){ for(int i=0;i<G[v].size();i++){ int u=G[v][i]; if(!vis[u]){ res++; vis[u]=1; dfs(u); } } } int main(){ int k; while(~scanf("%d%d",&n,&k)){ for(int i=0;i<=maxn;i++) G[i].clear(); memset(vis,0,sizeof(vis)); int a,b; for(int i=1;i<n;i++){ scanf("%d%d",&a,&b); G[a].push_back(b); } int ans=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); res=0; dfs(i); if(res==k) ans++; } printf("%d\n",ans); } } /* 7 2 1 2 1 3 2 4 2 5 3 6 3 7 */
//感觉第二种方法还是比较好想到的。
相关文章推荐
- js实现图片放大和拖拽特效代码分享
- Spring MVC 两种方式
- C语言基础学习——第7天(二维数组、指针数组等)
- 轮廓处理,计算几何和平面划分的函数集合
- 用Tarjan算法求无向连通图割点&&割边
- ALTERA DE2 之 verilog HDL 学习笔记05-FPGA UART RS232
- 易语言编程乱码解决方案
- 软件测试
- UIDatePicker
- 起起落落平常事
- 【SQL Server 2008 安装篇】详细安装步骤
- 单源最短路 dijkstra + heap 实现
- R语言包_lubridate
- 子查询
- 黑马程序员----c基础笔记----数组部分
- 关于为c++类中的变量赋值的问题
- 初识Groovy
- hdu 1111 Secret Code(复数·展开·深搜·输出)
- stack && queue && priority_queue 使用方法 (栈, 队列, 优先队列)
- POJ 1731 Orders