訊息傳遞(最小SCC)

2021-08-07 22:53:35 字數 1582 閱讀 5612

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