題目描述 description
有個同學(編號為 1 到)正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個
固定的資訊傳遞物件,其中,編號為的同學的資訊傳遞物件是編號為的同學。
遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前
所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人可以從若干人那裡獲取資訊,
但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。當有人從別人口中得知自
己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?
輸入描述 input description
輸入共 2行。
第 1行包含1個正整數n,表示n個人
第 2 行包含n 個用空格隔開的正整數t1 ,t 2 ,……,tn ,
其中第i個整數ti表示編號為i
的同學的資訊傳遞物件是編號為 t i 的同學,ti≤n 且 ti≠i。
資料保證遊戲一定會結束。
輸出描述 output description
輸出共 1行,包含 1個整數,表示遊戲一共可以進行多少輪。
資訊傳遞這道題,也屬於乙個很久很久沒能a的題,這段時間也成功a了。
基本思路是,對連續的一些點進行編號,如果當要編號時,這個該被編號的點已經有編號了,那麼這個點一定是乙個自環的開頭了。因為可以看做從環首開始,再到環首結束的一次遊戲,所以這時答案就是該編的號-本來的編號。接著再從沒有編號的點開始列舉。
不過這個題有乙個特殊情況,如下圖。
當把數字1所連的環判完之後,再從二的右下角開始,也會發現當該編號時,該編號的點已經被編號,所以需要記錄每乙個點所在的層數,如紅色為1,黑色為2,如果層數不相等,那麼直接return掉這種情況,因為答案還是會與之前一樣,是這個環的長度。
#include#include#define maxn 200005
using namespace std;
int n;
int mes[maxn];
int vis[maxn];
int cnt,ans=999999999;
bool flag=true;
int dep[maxn];
void dfs(int now,int d)
if(vis[now])
vis[now]=cnt;
dep[now]=d;
dfs(mes[now],d);
}int main()
cout<
codevs4511資訊傳遞(Tarjan求環)
有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資訊,但是每...
4511 資訊傳遞
題目描述 description 有個同學 編號為 1 到 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個 固定的資訊傳遞物件,其中,編號為的同學的資訊傳遞物件是編號為的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前 所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有...
神經資訊傳遞
第乙個感覺神經元直接連線感受器,就拿觸覺感受器來舉例吧,觸覺感受器在解除到東西的時候發生微弱的形變,驅動上面的機械門控通道開啟,導致鈣 鈉離子內流同時鉀離子外流,導致膜電位發生改變,於是周圍的電壓門控通道會因此開啟導致更多的電壓門控通道開啟,最後顯著改變膜電位,於是神經元上面的電壓門控通道會感受到周...