題目描述
有 n 個同學(編號為 1 到 n )正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為 i 的同學的資訊傳遞物件是編號為 t_i 的同學。
遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人可以從若干人那裡獲取資訊, 但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。當有人從別人口中得知自 己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?
輸入輸出格式
輸入格式:
共 2 行。
第 1行包含1個正整數 n ,表示 n 個人。
第 2 行包含 n 個用空格隔開的正整數 t_1,t_2,……t_n,其中第 i 個整數 t_i
表示編號為 ii 的同學的資訊傳遞物件是編號為 t_i的同學, t_i≤n 且 t_i≠i 。
輸出格式:
1 個整數,表示遊戲一共可以進行多少輪。
【分析】
顯而易見的是如果乙個人可以從其他人的口中得知自己的訊息,則這乙個完整的資訊鏈也一定乙個環,且由於每個點的入度為一,所以整個環一定為乙個單向環。那麼,環上每個人得知得到自己資訊輪數是一樣的均為環的長度。除去環本身,只可能有很多條單向的鏈指向環中的乙個節點。
所以鏈本身可以忽略,只需要計算環的長度或環中任意一點到自身的距離,再比較最小值。
下面看**:
#include
#include
#include
#include
using
namespace
std;
const
int maxn=200100;
int n,t[maxn],ans=0x7fffffff;
int step[maxn];
bool used[maxn];
int main()
step[x]=j;
x=t[x],j++;
}x=i;
while(1)}}
printf("%d\n",ans);
return
0;}
並查集 NOIP 2015 Day1 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
noip2015day1t2 資訊傳遞
把每個同學看成乙個點,傳遞關係看成一條邊,點數等於邊數,因此圖由若干個環或環鏈復合邊數等於點數的東西組成,不存在孤立鏈。在圖上,傳遞一輪後,每個點掌握沿邊前乙個點的資訊,傳遞x輪後,任意乙個點恰好掌握沿邊反向前進x條邊的路徑上的所有點的資訊,要聽到自己的資訊,也就是在環上走一圈。這樣就把題目抽象為找...
資訊傳遞 NOIP2015 day1 T2
題文 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊,...