P2661 資訊傳遞

2022-07-20 04:45:12 字數 1593 閱讀 8068

題意:

有 n 個同學(編號為 1 到 n )正在玩乙個資訊傳遞的遊戲。

在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 i 的同學的資訊傳遞物件是編號為$t_i$

遊戲開始時,每人都只知道自己的生日。

之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件

(注意:可能有人可以從若干人那裡獲取資訊, 但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。

當有人從別人口中得知自 己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?

輸入樣例

5

2 4 2 3 1

輸出樣例

3
樣例1解釋

遊戲的流程如圖所示。當進行完第3輪遊戲後, 4號玩家會聽到 2 號玩家告訴他自己的生日,所以答案為 3。當然,第 3 輪遊戲後,2號玩家、 3 號玩家都能從自己的****得知自己的生日,同樣符合遊戲結束的條件。

對於 30%的資料, n ≤ 200;

對於 60%的資料, n ≤ 2500;

對於100%的資料, n ≤ 200000。

並查集判最小環

假設資訊由a傳遞給b,那麼就連一條由a指向b的邊,同時更新a的父節點,a到它的父節點的路徑長也就是b到它的父節點的路徑長+1。

這樣我們就建立好了乙個圖,之後資訊傳遞的所有環節都按照這些路徑。遊戲結束的輪數,也就是這個圖里最小環的長度。

如果有兩個點祖先節點相同,那麼就可以構成乙個環,長度為兩個點到根節點長度之和+1。

#include#include

#include

#include

#include

using

namespace

std;

#define olinr return

#define _ 0

#define love_nmr 0

#define db doubleinline

intread()

while

(isdigit(ch))

return x*f;

}inline

void put(int

x)

if(x>9

) put(x/10

); putchar(x%10+'0'

);}int f[205050

];int dis[205050

];int ans=0x7fffffff

;int

n;inline

int findset(int

x)

return

f[x];

}inline

void doit(int x,int

y)

else

ans=min(ans,dis[x]+dis[y]+1); //

求最小環長度

}int

main()

P2661 資訊傳遞

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

P2661 資訊傳遞

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

P2661 資訊傳遞

並查集求解有向圖最小環 首先有個特殊要求的就是對於圖的邊是沒有長度的。然後我們採取乙個簡化操作,在找到這個環之間,由於只需要求環的長度,所以對於環的最後一條邊,不加入之前先判斷指向的點能不能最後指向原點。includeusing namespace std int n int ans 200050 ...