NOIP 2015 D1 T2 資訊傳遞

2021-07-23 11:44:29 字數 1228 閱讀 1521

【問題描述】

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

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

input

輸入共2行。

第1行包含1個正整數 n,表示 n 個人。

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

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

output

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

【資料規模與約定】

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

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

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

【題解】

將每個人知道的資訊加入環中,入度則用v[i]標記,u[i]記錄自身編號,dfs搜尋,當v[x]與自己相等時結束,輸出遊戲輪數maxx。

【**】

#include

int maxx,now;

int a[200001],v[200001],u[200001];

using

namespace

std;

void dfs(int x,int z)

u[x]=now;

v[x]=z;

dfs(a[x],z+1);

return;

}int main()

}cout

0;

}

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...

noip2015day1t2 資訊傳遞

把每個同學看成乙個點,傳遞關係看成一條邊,點數等於邊數,因此圖由若干個環或環鏈復合邊數等於點數的東西組成,不存在孤立鏈。在圖上,傳遞一輪後,每個點掌握沿邊前乙個點的資訊,傳遞x輪後,任意乙個點恰好掌握沿邊反向前進x條邊的路徑上的所有點的資訊,要聽到自己的資訊,也就是在環上走一圈。這樣就把題目抽象為找...