有n個同學(編號為1到n)正在玩乙個資訊傳遞的遊戲。
在遊戲裡每人都有乙個固定的資訊傳遞物件ti
。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件。
可能有人從若干人那裡獲取資訊,但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件。當有人從別人口中得知自己的生日時,遊戲結束。問該遊戲一共可以進行幾輪?
輸入共2行
第 1 行包含 1 個正整數n(2≤n≤200000),表示 n 個人。
第 2 行包含 n 個用空格隔開的正整數t1
,t2,
...,
tn,其中第i個整數ti
表示編號為i的同學,ti
<=
n 且ti
≠i,資料保證遊戲一定會結束。
輸出共1行,包含乙個整數,表示遊戲一共可以進行多少輪。 5
2 4 2 3 1
注意到每一輪同時將資訊進行傳遞,並且每個人的資訊傳遞者是固定的。
因為自己的資訊一開始只能由自己產生,那就意味著,將每個人的傳遞組合在一起,看成有向圖,如果存在環(題目保證存在),自己的資訊就被傳了回來,而進行的輪數即為這個環的結點數。
一點思考:本題200000的資料量,花費空間大概為18428 kb,大概4000000的int陣列,即大概20*200000在傳遞的過程中,每個人可能會記錄下很多別人的資訊,但這些資訊不都是我想要的,我只需要關注自己的資訊什麼時候能回來,因此並不需要花費更多空間。
本題採用了tarjan演算法
求解scc
,相關可以參考tarjan演算法求解強連通分量(scc)
#include
using
namespace
std;
#define m(a,b) memset(a,b,sizeof(b))
const
int maxn=200010;
int pre[maxn],sccno[maxn],dfs_clock,scc_cnt;
vector
g[maxn];
stack
s;int n;
int hash[maxn];
int dfs(int u)
else
if(!sccno[v])
}if(lowu==pre[u])
}return lowu;
}void find_scc(int n)
int main()
find_scc(n);//n個點
for(int i=1;i<=n;++i)
sort(hash+1,hash+n+1);
for(int i=1;i<=n;++i)
}return
0;}
Android訊息傳遞之元件間傳遞訊息
前言 上篇學習總結了android通過handler訊息機制實現了工作執行緒與ui執行緒之間的通訊,今天來學習一下如何實現元件之間的通訊。本文依然是為學習eventbus做鋪墊,有對比才能進步,今天主要介紹在eventbus出現之前的實現方式,通過intent方式這裡不做介紹。需求場景 方式一 通過...
mfc 訊息傳遞
訊息分類 windows的訊息都是以wm 為名,wm 的意思是 windows message mfc把訊息分為三大類 命令訊息 wm command 命令訊息意味著 使用者命令程式做某些操作 凡是ui物件產生的訊息都是這種命令訊息,可能來自選單或加速鍵或工具欄按鈕,並且都以wm command呈現...
Intent 訊息傳遞
android為了遮蔽程序的概念,利用不同的元件 activity service 來表示程序之間的通訊!元件間通訊的核心機制是intent,通過intent可以開啟乙個activity或service,不論這個activity或service是屬於當前應用還是其它應用的!一 intent概念 in...