洛谷 P2661資訊傳遞

2022-05-03 18:06:14 字數 1739 閱讀 1117

有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(多謝大神提點),而我...

腦洞大開的我,一開始是這麼想的...

當一輪遊戲完成之後,把每個點知道的所有資訊都跑一遍,找有沒有與該點相等的,如果有,結束並輸出這是第幾輪,沒有則繼續找後面的...但事實上,我們根本不需要具體求某個人知道那幾個人的資訊然後比較,只要知道他把自己的資訊傳遞出去之後能不能通過其他人回來即可,也就是說找到大於一的最小環...那麼自然就想到了tarjan。網上說用bfs、並查集巴拉巴拉都能ac,這種高深的東西....

#include#include

#include

#include

#include

using

namespace

std;

const

int max=200010

;int

low[max],dfn[max];

bool

isins[max];

int zhan[max],top=0

;int lts=0

;int js=0

,n,m;

intb;

vector

tu[max];

vector

lt[max];

void tarjan(int

i)

else

if(isins[tp])

low[i]=low[i]low[i]:dfn[tp];

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

while(i!=j);

}}void solve(intn)}

intmain()

solve(n);

int ans=2001000

;

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

printf("%d

",ans);

return0;

}

洛谷P2661 資訊傳遞

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

洛谷 P2661 資訊傳遞

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

洛谷 P2661 資訊傳遞

有 nn n 個同學 編號為 11 1 到 nn n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 ii i 的同學的資訊傳遞物件是編號為 tit iti 的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳...