1513 例 1 受歡迎的牛

2021-10-08 22:59:43 字數 1525 閱讀 6990

時間限制: 1000 ms 記憶體限制: 65536 kb

提交數: 808 通過數: 428

【題目描述】

原題來自:usaco 2003 fall

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

【輸入】

第一行兩個數 n,m;

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

【輸出】

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

【輸入樣例】

3 31 2

2 12 3

【輸出樣例】

1【提示】

樣例說明

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

資料範圍:

對於全部資料,1≤n≤104,1≤m≤5×104。

思路:縮點,是否只有乙個出度為0的縮點集合。

#include

using

namespace std;

const

int n=

5e4+5;

int n,m,dfn[n]

,vis[n]

,low[n]

,t=0

,num=

0,b[n]

,cnt[n]

;int x[n]

,y[n]

,out[n]

;vector<

int> a[n]

;stack<

int> s;

void

dfs(

int x)

else

if(vis[y]

) low[x]

=min

(low[x]

,low[y]);

}if(low[x]

==dfn[x]

) b[x]

=num;

cnt[num]++;

vis[x]=0

; s.

pop();

}}intmain()

for(

int i=

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

(!dfn[i]

)dfs

(i);

for(

int i=

0;i)//新建圖,縮點

int res=

0,x=0;

for(

int i=

1;i<=num;i++)if

(res>1)

}printf

("%d\n"

,cnt[x]);

return0;

}

受歡迎的牛

題目大意 給你n個點,m條單項邊,求可以和所有點聯通的點的個數。注釋 n 10,000,m 50,000 想法 這題也是一道tarjan裸題,讓我來a掉吧!這題和愛在心中 愛在心中?猛戳 類似,只不過這題有坑.用panxf的模板a不掉這道題.為什麼呢?因為n的資料範圍,會mle。但是我們發現,這道題...

tarjan 受歡迎的牛

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

受歡迎的牛(tarjan)

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