受歡迎的牛 強連通分量 壓縮點

2021-09-29 04:46:46 字數 1574 閱讀 4423

description

原題來自:usaco 2003 fall

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 n 頭牛,給你 m 對整數 (a,b),表示牛 a 認為牛 b 受歡迎。這種關係是具有傳遞性的,如果 a 認為 b 受歡迎,b 認為 c 受歡迎,那麼牛 a 也認為牛 c 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。

input

第一行兩個數 n,m;

接下來 m 行,每行兩個數 a,b,意思是 a 認為 b 是受歡迎的(給出的資訊有可能重複,即有可能出現多個 a,b)。

output

輸出被除自己之外的所有牛認為是受歡迎的牛的數量。

sample input 1

3 31 2

2 12 3

sample output 1

hint

樣例說明

只有第三頭牛被除自己之外的所有牛認為是受歡迎的。

資料範圍:

對於全部資料,1≤n≤10,000;1≤m≤50,000

題目大意:

找出被除自己以外所有牛歡迎的牛,典型的強連通分量,找出所有的強連通分量,然後進行壓點,如果想滿足題目要求,就必須讓所有點**度為0的點有且僅有乙個。

#include

using namespace std;

const

int maxn =

1e4+5;

int low[maxn]

,instack[maxn]

,dfn[maxn]

;int stack[maxn]

,in[maxn]

,t[maxn]

,tt[maxn]

;int tot,num,cnt;

int n,m;

struct node};

vectore[maxn]

;void

add_edge

(int u ,

int v)

void

tarjan

(int u)

else

if(instack[v])}

if(dfn[u]

== low[u]

) t[stack[num]

]= cnt;

tt[cnt]++;

instack[stack[num]]=

0;num--

; cnt++;}

}int

main()

for(

int i =

1; i <= n ; i++

)int sum =0;

for(

int i =

1; i <= n ; i++)}

int flag =0;

for(

int i =

0; i < cnt ; i++)}

if(flag ==1)

cout << sum << endl;

else

cout <<

"0"<< endl;

return0;

}

HAOI2006 受歡迎的牛 強連通分量

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 n 頭牛,給你 m 對整數 a,b 表示牛 a 認為牛 b 受歡迎。這種關係是具有傳遞性的,如果 a 認為 b 受歡迎,b 認為 c 受歡迎,那麼牛 a 也認為牛 c 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。loj 1009...

點連通分量 邊連通分量 割點和橋 強連通分量

老是搞不清他們的關係,不知道該用那份 今天理了一下,整理一下模板 點連通分量 可以求出點連通分量包含哪些點,那個點屬於那個連通分量 struct edge int pre maxn iscut maxn bccno maxn dfs clock,bcc cnt vectorg maxn bcc ma...

bzoj1501受歡迎的牛(強聯通分量 縮點)

首先,如果是乙個有向無環圖,那麼答案就是沒有出度的那個點,並且如果有多個沒有出度的點,那麼也不會出現乙個點能被所有點 歡迎 如果不是這樣乙個圖,那麼縮點就好。記錄一下每個縮的點的size,每個點屬於的聯通分量就好,注意一下沒有答案的情況就好 include include include inclu...