有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輸出樣例#1:2 4 2 3 1
3樣例1解釋
遊戲的流程如圖所示。當進行完第 3 輪遊戲後, 4 號玩家會聽到 2 號玩家告訴他自
己的生日,所以答案為 3。當然,第 3 輪遊戲後, 2 號玩家、 3 號玩家都能從自己的訊息
**得知自己的生日,同樣符合遊戲結束的條件。
對於 30%的資料, n ≤ 200;
對於 60%的資料, n ≤ 2500;
對於 100%的資料, n ≤ 200000。
分析:求最小環的問題,首先可以把所有的入度為0的點刪掉,然後深搜。
1 #include2 #include34using
namespace
std;56
const
int n = 200100;7
intmp[n];
8int
ru[n];
9bool
v[n];
10int n,ans = 99999999;11
12void del(int
a)13
18void dfs(int a,int b,int
step)
1926
if(!v[mp[a]])
2731}32
intmain()
3340
for(int i=1;i<=n;++i)
41if(ru[i]==0 && !v[i]) del(i);
42for(int i=1;i<=n;++i)
43if(!v[i]) dfs(i,i,0
);44 printf("%d"
,ans);
45return0;
46 }
P2661 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
P2661 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
P2661 資訊傳遞
並查集求解有向圖最小環 首先有個特殊要求的就是對於圖的邊是沒有長度的。然後我們採取乙個簡化操作,在找到這個環之間,由於只需要求環的長度,所以對於環的最後一條邊,不加入之前先判斷指向的點能不能最後指向原點。includeusing namespace std int n int ans 200050 ...