noip 2015 資訊傳遞

2021-08-04 22:35:43 字數 1601 閱讀 1190

題目描述

有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 個整數,表示遊戲一共可以進行多少輪。

資料範圍:

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

這道題其實就是個簡單的dfs,然而蒟蒻的我還是沒有一次ac。想了乙個小技巧,看題解裡沒有人用,就來總結一下。

這道題打眼看上去可以轉換成一張有向有環圖,而題目要求的就是最小環。貌似乙個dfs就可以解決了。我原本的想法是對於每乙個點都進行一遍dfs,但是是o(n^2)的解法,肯定會t。

於是又想了一下,已經dfs過的點就不用dfs了。所以我就開了乙個vis陣列,把訪問過的點打上標記並且不清零,遇到標記就判斷能否更新答案。提交了一遍發現wa 了。

本來以為這是一道sb題,結果自己sb了。

這樣有乙個bug,就是vis標記不一定是這一次dfs打上的,不一定是環。

舉個例子,兩條路1->3->5->2->……和4->5->7->……

1->3>5>2這條路搜尋完了發現沒有環,然後返回主程式開始dfs4這個點,發現5已經打上標記了,程式就開始更新答案,但是並不是環。

於是我又開了乙個tmpvis陣列,表示這個點是不是在這一次被搜尋到的。如果是,就表示有環,更新答案。如果不是,就不更新,continue。

**如下:

#include

#include

using

namespace

std;

struct nodemem[200001];

int head[200001]=;

int size=0;

int dep[200001]=;

int ans=1e9;

bool vis[200001]=;

bool tmpvis[200001]=;

int read()

void add(int from,int to)

void dfs(int x,int depth)

else

if(tmpvis[v])

}}int main()

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

}printf("%d",ans);

return

0;}

NOIP 2015 資訊傳遞

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

noip2015 資訊傳遞

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

NOIP2015 資訊傳遞

給你乙個有向圖,要你找到圖中的最小環。呵呵,去年聯賽前做了這道題,連圖都不會存 今年聯賽前終於可以秒切了.tarjan求出最小的非單個點的強連通分量就好了 好像還可以用拓撲排序那套理論加上dfs求,嗯,膩害 include include include include include includ...