codevs4511資訊傳遞(Tarjan求環)

2022-04-06 04:14:31 字數 1811 閱讀 2436

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

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

輸入格式:

輸入共2行。

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

第2行包含n個用空格隔開的正整數t1,t2,……,tn其中第i個整數ti示編號為i

的同學的資訊傳遞物件是編號為ti的同學,ti≤n且ti≠i

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

輸出格式:

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

輸入樣例#1:

5

2 4 2 3 1

輸出樣例#1:

3
樣例1解釋

遊戲的流程如圖所示。當進行完第 3 輪遊戲後, 4 號玩家會聽到 2 號玩家告訴他自

己的生日,所以答案為 3。當然,第 3 輪遊戲後, 2 號玩家、 3 號玩家都能從自己的訊息

**得知自己的生日,同樣符合遊戲結束的條件。

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

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

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

//

tarjan 求環模板

#include#include

#include

#define maxn 200010

using

namespace

std;

inthead[maxn],stack[maxn],loop[maxn];

bool

in_stack[maxn];

intdfn[maxn],low[maxn];

intn,x,y,a,b,num,cnt,ans,cur,top,loop_num;

struct

node

e[maxn

<<1

];void add(int

from,int

to)inline

intinit()

while(c>='

0'&&c<='9')

return x*f;

}void tarjan(int

u)

else

if(in_stack[v])

}if(dfn[u]==low[u])

count++;

in_stack[stack[top]]=false

; top--;

loop_num++;

loop[loop_num]=count;

}}int

main()

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

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

ans=0x7ffffff

;

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

if(loop[i]>1

) ans=min(ans,loop[i]);

printf(

"%d\n

",ans);

return0;

}

Codevs 4511 資訊傳遞

題目描述 description 有個同學 編號為 1 到 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個 固定的資訊傳遞物件,其中,編號為的同學的資訊傳遞物件是編號為的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前 所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有...

4511 資訊傳遞

題目描述 description 有個同學 編號為 1 到 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個 固定的資訊傳遞物件,其中,編號為的同學的資訊傳遞物件是編號為的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前 所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有...

NOIP 2015 D1 T2 資訊傳遞

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