受歡迎的牛 Tarjan

2021-10-25 12:36:32 字數 1577 閱讀 4571

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

輸入格式

第一行兩個數 ;

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

輸出格式

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

樣例輸入

3 31 2

2 12 3輸出1

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

這道題寫了好幾天,前幾天每天就是只看了半個小時,今天下午下定決心看這個題 終於把題意,演算法,各陣列弄清楚了

先用tarjan演算法處理所有的強連通分量塊出來,同時計算每個強連通塊中點的個數。然後列舉所以的邊,如果一條邊的兩個結點屬於不同的強連通塊,那麼就把發出這條邊的聯通塊的出度+1,最後尋找是否存在出度為0的強連通塊,因為受所有牛的歡迎(在乙個強聯通塊中的牛只要有乙個歡迎另一頭不再強連通塊中的牛,那麼強連通塊中其他牛就歡迎)所以一定所以的強連通塊都有邊連向這個強聯通塊。

sc是強連通塊的塊數

scc表示不同的強連通塊,sz表示強連通塊中的點數

#include

#include

#include

#include

#define mem(a,b) memset(a,b,sizeof(a))

const

int n=

2020

;typedef

long

long ll;

using

namespace std;

struct node

e[n]

;int head[n]

,tot;

void

add(

int u,

int v)

int dfn[n]

,low[n]

,cnt,s[n]

,tp;

int scc[n]

,sc;

int sz[n]

,n,m,out[n]

;void

tarjan

(int u)

elseif(

!scc[v]

) low[u]

=min

(low[u]

,low[v]);

}if(dfn[u]

==low[u])}

intmain()

for(

int i=

1; i<=n; i++

)for

(int u=

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

int ans=0;

for(

int i=

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

}printf

("%d\n"

,sz[ans]);

return0;

}

tarjan 受歡迎的牛

題 既然愛慕關係可以傳遞,那麼將互相可達的某幾個點縮成乙個點,就能簡化原圖了,那麼很自然想到tarjan求強連通分量 那麼就只需找到可以被所有縮點遍歷到的那個縮點 再輸出它所含的點數就行了 先用tarjan將所有聯通分量進行縮點,縮點後考慮出度為0的點的個數 1 個數大於1的時候,顯然不存在受歡迎的...

受歡迎的牛(tarjan)

題目連線 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第一行兩個數n,m。接下來m行,每行兩個數a,b,意思...

2017 07 14 Tarjan(受歡迎的牛)

include include include include include include include include include define mm 50002 define nn 10002 using namespace std int n,m,cnt,sign,top,tot i...