題目描述
有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 個整數,表示遊戲一共可以進行多少輪。
輸入輸出樣例
輸入樣例:
52 4 2 3 1
輸出樣例:
3資料要求:
對於 30%的資料, n ≤ 200;
對於 60%的資料, n ≤ 2500;
對於 100%的資料, n ≤ 200000。
解題分析:
轉化為求乙個圖中的最小環。由於每乙個點只有一條出邊,因此每個點最多只能出現在乙個環中。這樣問題變得簡單:用深搜搜尋所有的環,環中點的個數就是乙個備選答案。
預處理:為了提高效率,需要利用拓撲排序的方法將入度為0的點做標記,因為這些點不可能出現在任何乙個環中。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define n 200005 int n, next[n], in[n] = /*每乙個點的入度*/, ans = n, used[n] = , dfsn[n], no = 0; int read_i() return ans; } void dfs(int n) dfs(next[n]); } int main() for(i=1; i<=n; i++) } // 用類似於拓撲排序的方法,標識不可能在環中的點 while(!q.empty()) // 從沒有深搜過的點出發進行深搜 for(i=1; i<=n; i++) cout<
<
NOIP2015提高組 資訊傳遞
本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 因為本題涉及到連通成環的問題,因此可以考慮用並查集來做 注意 此題不能用扁平化,因為我們要統計用了多少次才能到達其祖先,相當於要記錄樹中的dep值,但由於會構成環,所以用普通的並查集來做方便一些 code 1 include2 p...
NOIP2015提高組Day1 資訊傳遞
問題描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取...
NOIP 2015 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...