洛谷 P2661 資訊傳遞

2021-08-20 04:40:26 字數 1780 閱讀 1957

有 nn

n 個同學(編號為 11

1 到 nn

n )正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 ii

i 的同學的資訊傳遞物件是編號為 tit_iti

​ 的同學。

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

輸入格式:

輸入共2行。 第1行包含1個正整數 nn

n ,表示 nn

n 個人。

第2行包含 nn

n 個用空格隔開的正整數 t1,t2,⋯⋯,tnt_1,t_2,\cdots\cdots,t_nt1

​,t2

​,⋯⋯

,tn​

,其中第 ii

i 個整數 tit_iti

​ 表示編號為 ii

i 的同學的資訊傳遞物件是編號為 tit_iti

​ 的同學, ti≤nt_i \leq nti

​≤n 且 ti≠it_i \neq iti

​≠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。

顯而易見,按照題目中給的樣例解釋我們是很難看懂的。

這道題在洛谷中的標籤是並查集和圖論。

但是我沒有用到並查集而是拓撲排序+建圖遍歷。

為什麼我會想到拓撲排序呢?

題目中給出每個同學只能把資訊交給乙個其他的同學。

所以我們可以根據題意建立乙個有向圖。

然後找到最小環,即為遊戲可以進行的輪數。

所以我們可以先用拓撲排序刪去不在環中的點。

然後遍歷一遍圖找到最小環直接輸出就行了。

#include#include#includeusing namespace std;

const int maxn=200000;

int t[maxn],n,ans=19260817,dg[maxn],tot=0;

bool flag=0,visit[maxn];

void topsort()

}void dfs(int x,int step)

visit[x]=1;

dfs(t[x],step+1);

}int main()

topsort();

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

cout<

return 0;

}

洛谷P2661 資訊傳遞

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

洛谷 P2661 資訊傳遞

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

洛谷P2661 資訊傳遞

1這使我意識到提高組有些題難就難在他的演算法標籤是隱晦的,讀完題,感覺除了暴力就沒有其他想法了 看了題解,才知道原來是求有向圖中最小的環,仔細想想還真是的 pragma gcc optimize 2 include using namespace std define pi acos 1.0 def...