2015 提高組 資訊傳遞 tarjan找最小環

2022-04-28 18:21:08 字數 1482 閱讀 1646

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

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 。

這題暴力的話好像是真的難寫。

資訊傳遞,在兩個可以相互傳遞的人之間連邊(單向),表示資訊的傳遞,然後這個題不就變成了,求從圖中某乙個點的出發繞回自己的最短路徑了嗎,顯然這不就是利用tarjan求最小環麼?

所以這題不就解決了嘛。

#include #include 

#define n int(2e5+2)

using

namespace

std;

struct

ahahedge[n];

intn,x,ans,vis[n];

inthead[n],tot;

void add(int x,inty)

intdfn[n],low[n],index;

intstack[n],top;

bool

in[n];

intbelong[n],cnt;

void tarjan(int

s)

else

if(in[v]&&low[s]>dfn[v])low[s]=dfn[v];

}if(dfn[s]==low[s])

while(p!=s);

}}int

main()

printf("%d

",ans);

}

NOIP2015提高組 資訊傳遞

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

NOIP2015提高組 資訊傳遞

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 因為本題涉及到連通成環的問題,因此可以考慮用並查集來做 注意 此題不能用扁平化,因為我們要統計用了多少次才能到達其祖先,相當於要記錄樹中的dep值,但由於會構成環,所以用普通的並查集來做方便一些 code 1 include2 p...

NOIP2015提高組Day1 資訊傳遞

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