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

2021-08-10 07:52:25 字數 1345 閱讀 5745

題目描述有 n 個同學(編號為 1 到 n ) 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 ii的同學的 資訊傳遞物件是編號為 ti 的同學。

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

輸入格式

輸入共2行。 第1行包含1個正整數 n ,表示 n 個人。

第2行包含 n 個用空格隔開的正整數 t1,t2,⋯⋯,tn ,其中第 i 個整數 ti 表示編號為 i的同學的資訊傳遞物件是編號為 ti的同學, ti≤n 且 ti≠i 。

資料保證遊戲一定會結束。

輸出格式

輸出共1行,包含1個整數,表示遊戲一共可以進行多少輪。

n≤200000

根本沒想過dfs就可以看出我對圖論的熟悉程度真的很辣雞了……

顯然顯然又顯然,我們可以發現這是乙個判斷環的問題。

如圖。

根據題意,同一連通塊裡是不可能出現兩個環的(因為每個點出度只能為1)。然而這可能並不是乙個連通圖,所以仍然是要判斷最小環的。

並查集。判環可直接完成,另記錄環的長度即可。

是有向圖噢///

以及,有向圖中一點的父節點是它指向的那個點。

#include

using

namespace

std;

int n;

int fa[200002],pre[200002];//fa存第i個點的祖先節點。pre存第i個點的父節點。實則用a陣列也可以。但是不知道為什麼這樣比較快。

int a[200002];//第i個點的指向。

int minn=10000000;

inline

void read(int &x)

while(s>='0'&&s<='9')

x*=f;

}inline

int find_(int x)

int main()

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

fa[x]=y;//合併。

pre[x]=a[i];//這就是,呃……就是這樣。

}cout

0;}

NOIP 2015 D1 T2 資訊傳遞

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

NOIP2015 D1T2 資訊傳遞

一道有很多種解法的題目 通過劃歸,發現就是求最小環 那麼立即能想到的演算法 1 tarjan求強連通分量,最無腦 2 對於每個連通分量用topo sort,相當於剪去其他不在環上的邊 不過用帶權並查集也可以解決這道題目 首先發現只要一條邊連線的兩個點a b在之前已經在乙個集合中,則必定會形成乙個環 ...

noip2015 d1t2 資訊傳遞

題目鏈結 題意 給定乙個圖,每個節點的出度為1,求最小環的結點數 參考 可以先把不在環內的點清除掉,再對於每個環跑一遍長度 1 include2 include3 include4 using namespace std 5 define maxn 200010 6int in degree max...