题目:有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮?

解法:利用并查集将相连通的点连起来,可以使用带权并查集顺带计算每个点到父亲结点的距离,从而知道环的结点数。也可以bfs每个强联通分量找最小的环。

我去年比赛打的是bfs,这个代码是带权并查集。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6 #define N 200010
7
8 int fa[N],d[N];
9
10 int mmin(int x,int y) {return x<y?x:y;}
11 int mabs(int x) {return x<0?-x:x;}
12 int ffind(int x)
13 {
14 if (fa[x]!=x)
15 {
16 int y=fa[x];
17 fa[x]=ffind(y);
18 d[x]+=d[y];
19 }
20 return fa[x];
21 }
22 int main()
23 {
24 int n,x,y;
25 scanf("%d",&n);
26 int mn=n;
27 for (int i=1;i<=n;i++) fa[i]=i,d[i]=0;//表示到祖先的距离
28 for (int i=1;i<=n;i++)
29 {
30 scanf("%d",&y);
31 x=i;
32 int fx=ffind(x),fy=ffind(y);
33 if (fx!=fy)
34 {
35 fa[x]=fy;//不可反,由于建树是有顺序的,想判环必须是编号大的点为父亲
36 d[x]=d[y]+1;
37 }
38 else mn=mmin(mn,d[y]+1);
39 }
40 //bfs() 或 带权并查集
41 printf("%d\n",mn);
42 return 0;
43 }

Code1

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 #include<algorithm>
7 #include<set>
8 using namespace std;
9
10 const int N=210000,INF=(int)1e9;
11 int n,fa[N],d[N];
12
13 int minn(int x,int y){return x<y ? x:y;}
14
15 int findfa(int x)
16 {
17 if(fa[x]!=x)
18 {
19 int xx=fa[x];
20 fa[x]=findfa(fa[x]);
21 d[x]=d[x]+d[xx];
22 }
23 return fa[x];
24 }
25
26 int main()
27 {
28 scanf("%d",&n);
29 int x,y,xx,yy,ans=INF;
30 for(int i=1;i<=n;i++) fa[i]=i,d[i]=0;
31 for(int i=1;i<=n;i++)
32 {
33 x=i;
34 scanf("%d",&y);
35 xx=findfa(x);yy=findfa(y);
36 if(xx==yy)
37 {
38 ans=minn(ans,d[x]+d[y]+1);
39 }
40 else
41 {
42 fa[xx]=x;
43 d[xx]=d[x];
44 fa[x]=y;
45 d[x]=1;
46 }
47 }
48 printf("%d\n",ans);
49 return 0;
50 }

Code2(by gyw)

最新文章

  1. ISE应用入门的一些问题
  2. Ubuntu 15.10安装KVM
  3. pv命令监控Linux命令的执行进度
  4. 详解Bootstrap按钮组件
  5. PHP程序员面试技巧之口试题分享
  6. Map学习
  7. 原生JS面向对象思想封装轮播图组件
  8. innodb结构解析工具---innodb_ruby
  9. NDK GDB 中打印vector , vector&lt;vector &lt;&gt; &gt;
  10. 如何对 GIT 分支进行规划? (转)
  11. 复写equals、hashCode和toString方法
  12. Java微信公众平台开发_07_JSSDK图片上传
  13. 【笔记】css 自定义select 元素的箭头样式
  14. Node 体验 事件驱动、非阻塞式 I/O
  15. 执行shell文件是,提示chmod: 更改&#39;./shell1.sh&#39; 的权限: 不允许的操作。
  16. 《Java程序性能优化》之设计优化
  17. 上传插件dropzone.js实例
  18. OOD与OOP的思想的感悟
  19. Memcached: 目录
  20. 关于webApi使用session

热门文章

  1. 3D动漫人物代码
  2. Django(投票程序)
  3. 剑指offer-查找数组中重复的数字
  4. 使用Jenkins+Blue Ocean 持构建自动化部署之安卓源码打包、测试、邮件通知
  5. python列表字符串集合常用方法
  6. Xctf攻防世界—crypto—Normal_RSA
  7. Jenkins 部署打包文件 并通过SSH上传到 linux服务器
  8. 两节锂电池保护IC,芯片电路图如何设计
  9. winform 添加背景图 闪屏问题解决
  10. 无法获取 vmci 驱动程序版本: 句柄无效。 驱动程序 vmci.sys 版本不正确。请尝试重新安装 VMware Workstation。 打开模块DevicePowerOn电源失败。