有 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:
5輸出樣例#1:2 4 2 3 1
3樣例1解釋
遊戲的流程如圖所示。當進行完第 3 輪遊戲後, 4 號玩家會聽到 2 號玩家告訴他自己的生日,所以答案為 3 。當然,第 3 輪遊戲後, 2 號玩家、 3 號玩家都能從自己的****得知自己的生日,同樣符合遊戲結束的條件。
對於 30% 的資料, n≤200 ;
對於 60% 的資料, n≤2500 ;
對於 100% 的資料, n≤200000 。
這題暴力的話好像是真的難寫。
資訊傳遞,在兩個可以相互傳遞的人之間連邊(單向),表示資訊的傳遞,然後這個題不就變成了,求從圖中某乙個點的出發繞回自己的最短路徑了嗎,顯然這不就是利用tarjan求最小環麼?
所以這題不就解決了嘛。
#include #include#define n int(2e5+2)
using
namespace
std;
struct
ahahedge[n];
intn,x,ans,vis[n];
inthead[n],tot;
void add(int x,inty)
intdfn[n],low[n],index;
intstack[n],top;
bool
in[n];
intbelong[n],cnt;
void tarjan(int
s)
else
if(in[v]&&low[s]>dfn[v])low[s]=dfn[v];
}if(dfn[s]==low[s])
while(p!=s);
}}int
main()
printf("%d
",ans);
}
NOIP2015提高組 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
NOIP2015提高組 資訊傳遞
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 因為本題涉及到連通成環的問題,因此可以考慮用並查集來做 注意 此題不能用扁平化,因為我們要統計用了多少次才能到達其祖先,相當於要記錄樹中的dep值,但由於會構成環,所以用普通的並查集來做方便一些 code 1 include2 p...
NOIP2015提高組Day1 資訊傳遞
問題描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取...