vijos 資訊傳遞 tarjan找環

2022-05-18 22:09:34 字數 1727 閱讀 3622

有 n 個同學(編號為 1 到 n)正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 i 的同學的資訊傳遞物件是編號為 t_iti​的同學。

遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人可以從若干人那裡獲取資訊, 但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。當有人從別人口中得知自己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?

輸入共 2 行。

第 1 行包含 1 個正整數 n,表示 n 個人。

第 2 行包含 n 個用空格隔開的正整數 t_1t1​, t_2t2​, … … , t_ntn​,其中第 i 個整數t_iti​表示編號為 i 的同學的資訊傳遞物件是編號為 t_iti​的同學, t_iti​≤ n 且 t_iti​≠ i。

資料保證遊戲一定會結束。

輸出共 1 行,包含 1 個整數,表示遊戲一共可以進行多少輪。

5

2 4 2 3 1

3
對於 30%的資料, n ≤ 200;

對於 60%的資料,n ≤ 2500;

對於 100%的資料,n ≤ 200000。

【輸入輸出樣例 1 說明】

遊戲的流程如圖所示。當進行完第 3 輪遊戲後,4 號玩家會聽到 2 號玩家告訴他自己的生日,所以答案為 3。當然,第 3 輪遊戲後,2 號玩家、3 號玩家都能從自己的****得知自己的生日,同樣符合遊戲結束的條件。

noip 2015 提高組 day 1 第二題

tarjan裸題,存板子:

1 #include2 #include

3#define maxn 233333

4struct

node;

7node e[maxn];

8int

read();

9int

n,cnt,pre[maxn],dfn[maxn],low[maxn],stack[maxn],top,bcnt,time,size[maxn],anss;

10bool

instack[maxn];

11void tarjan(int

);12

void build(int,int

);13

intmain()

21for(int i=1;i<=n;i++)

22if(!dfn[i]) tarjan(i);

23 anss=1e9;

24for(int i=1;i<=bcnt;i++)

25if(size[i]>1&&size[i]size[i];

26 printf("%d"

,anss);

27return0;

28}29void tarjan(int

x)38

else

if(instack[to]&&dfn[to]dfn[to];39}

40if(dfn[x]==low[x])while(k!=x);48}

49}50void build(int x,int

y)53

intread()

56while('0'

<=c&&c<='

9')ans=ans*10+c-48,c=getchar();return ans*f;

57 }

tarjan找環

NOIP2015 資訊傳遞 tarjan

題目思路 即強聯通分量中點的數量不為1的最小值是多少。tarjan的原理是維護dfn和low陣列,當下乙個點的low比自己小的時候就說明自己的兒子或自己能到達可以到達自己的點 自己的祖先 那麼也就形成了環。形成環就形成了乙個強聯通分量。以下是 include include include incl...

codevs4511資訊傳遞(Tarjan求環)

有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊,但是每...

題解 P2661 資訊傳遞(tarjan)

這道題用來解決的方法很多,最近學了tarjan,所以我們不妨用tarjan來解決。我們將這個關係用有向圖的方式存下來,那麼答案就是這個圖里最小的環的大小。對於tarjan陣列,我們記錄dfn代表時間戳,low代表其強連通分量中的根的時間戳 大概吧 初始化dfn low index,然後把這個點存進棧...