並查集 NOIP 2015 Day1 資訊傳遞

2022-09-18 01:06:11 字數 1381 閱讀 8169

題目描述

有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。

其實這題就是要求最小環

其實我們可以用並查集做

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

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

#include

#include

using

namespace

std;

int f[200002],deep[200002],n,minn,last;

int fa(int x)

return f[x];

}void check(int a,int b)

else minn=min(minn,deep[a]+deep[b]+1);

return;

}int main()

printf("%d",minn);

return

0;}

NOIP2015 Day1 資訊傳遞

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

noip2015D1T1 資訊傳遞(並查集判環)

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

初學並查集 並查集1

現在,我是用乙個初學者的眼光來寫並查集,此文最初寫於我學並查集的那天,後經過多次修改。1 並查集是什麼 並查集是乙個具有多個連通分支的圖,他擁有合併兩個連通分支,和查詢兩個元素是否位於同乙個連通分支的功能。2 並查集的簡單應用 並查集解決什麼問題 假如有一些點,你知道哪些點是直接相連的,但實際上間接...