每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 頭牛,給你 對整數 ,表示牛 認為牛 受歡迎。這種關係是具有傳遞性的,如果 認為 受歡迎, 認為 受歡迎,那麼牛 也認為牛 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。
輸入格式
第一行兩個數 ;
接下來 行,每行兩個數 ,意思是 認為 是受歡迎的(給出的資訊有可能重複,即有可能出現多個 )。
輸出格式
輸出被除自己之外的所有牛認為是受歡迎的牛的數量。
樣例輸入
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...