洛谷 P2661 信息传递

这题好久前就做过了...结果过了几个月还是不会...题解也看不懂...不过参考题解的一部分倒是懂了。

首先把每个人当做一个节点,从每个人向他要告诉的那个人连边,产生一张有向图。显然,一个人如果不在环上,那么就永远不可能听到自己的信息;一个人如果在环上,那么就会在进行“包含这个点的长度最小的环的长度"轮之后听到自己的信息。现在要求所有人听到自己信息的轮数的最小值,也就是要求图的最小环。

裸的最小环应该是floyed,$O(n^3)$。显然是不行的。可以注意到一点,就是这题的图中每个点最多只有一条出边。那么,一个点显然不可能出现在多个环里面。也就是说,一个点要么不在环中,要么只在一个单独的环中。因此,可以先把不在环上的点去掉;对于每个环,只需要从环上任意一点出发dfs一遍求出回到自身路径长度就行。

如何把不在环上的点去掉?可以用拓扑排序。拓扑排序做一遍只会留下环上点。

错误记录:

1.deque不会用,47行写成pop_back()

2.写题过程中记错题意,58行写成max

 1 //#pragma comment(linker, "/STACK:10240000,10240000")
 2 #include<cstdio>
 3 //#pragma GCC optimize (2)
 4 #include<deque>
 5 #include<malloc.h>
 6 using namespace std;
 7 struct E
 8 {
 9     int to,nxt;
10 }e[400100];
11 int f1[200100],ne,in[200100];
12 deque<int> q;
13 bool boo[200100];
14 int n,ans=0x3f3f3f3f;
15 int dfs(int x)
16 {
17     boo[x]=1;
18 //    if(dep==43429)
19 //    {
20 //        printf("1");
21 //    }
22     for(int k=f1[x];k!=0;k=e[k].nxt)
23         if(!boo[e[k].to])
24             return dfs(e[k].to)+1;
25 }
26 int main()
27 {
28     //int size = 256 << 20; // 256MB  //windows上可能需要手动扩栈,不然会爆栈
29     //char *p = (char*)malloc(size) + size;
30     //__asm__("movl %0, %%esp\n" :: "r"(p));
31     //freopen("testdata.in","r",stdin);
32     int i,a,t,k;
33     scanf("%d",&n);
34     for(i=1;i<=n;i++)
35     {
36         scanf("%d",&a);
37         e[++ne].to=a;
38         e[ne].nxt=f1[i];
39         f1[i]=ne;
40         in[a]++;
41     }
42     for(i=1;i<=n;i++)
43         if(in[i]==0)
44             q.push_back(i);
45     while(!q.empty())
46     {
47         t=q.front();q.pop_front();
48         boo[t]=1;
49         for(k=f1[t];k!=0;k=e[k].nxt)
50         {
51             in[e[k].to]--;
52             if(in[e[k].to]==0)
53                 q.push_back(e[k].to);
54         }
55     }
56     for(i=1;i<=n;i++)
57         if(!boo[i])
58             ans=min(ans,dfs(i)+1);
59     printf("%d",ans);
60     return 0;
61 }
时间: 2024-12-13 23:34:56

洛谷 P2661 信息传递的相关文章

洛谷P2661 信息传递 类似tarjan 强连通 灌水

洛谷P2661 信息传递类似tarjan 强连通 灌水 题意 求一个特殊的图的最小环 这个图 有一个性质 每个点只有一条出边 这样满足一个性质,一张图只有 一个环,以及别的连向他们的边都是一些连向 或者 间接连向这个环的树枝 这些树枝一定不会连成环,因为 每个点只有一条出边,而不可能有两条,所以只要把这些树枝边都删掉,然后再类似tarjan一样跑一遍灌水就行了 先说一下思路,这整道题就是给你几个带枝叶的环要你求最短环而已,于是在输入的时候可以把图中每个点的入度记录下来,然后再删除那些入度为0的点

洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2

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

洛谷——P2661 信息传递

https://www.luogu.org/problem/show?pid=2661#sub 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象).当有人从别人口中得知自己的生日时,游戏结束.

[NOIP2015] 提高组 洛谷P2661 信息传递

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

NOIP2015提高组T2 洛谷P2661 信息传递

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

洛谷 P2661信息传递

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

洛谷 P2661 信息传递 Label:并查集?

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

luogu P2661 信息传递 x

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

tg2015 信息传递 (洛谷p2661)

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