有 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 #includetarjan找環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 }
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,然後把這個點存進棧...