洛谷P2341 HAOI2006 受歡迎的牛

2022-03-01 07:08:18 字數 1685 閱讀 9272

每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶

歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你

算出有多少頭奶牛可以當明星。

輸入格式:

 第一行:兩個用空格分開的整數:n和m

 第二行到第m + 1行:每行兩個用空格分開的整數:a和b,表示a喜歡b

輸出格式:

 第一行:單獨乙個整數,表示明星奶牛的數量

輸入樣例#1:

3 3

1 22 1

2 3

輸出樣例#1:

1

只有 3 號奶牛可以做明星

【資料範圍】

10%的資料n<=20, m<=50

30%的資料n<=1000,m<=20000

70%的資料n<=5000,m<=50000

100%的資料n<=10000,m<=50000

知識點:強連通分量縮點tarjan演算法的裸題。

縮點之後整個圖肯定是一顆樹,只要找到出度為零的那個縮點裡所包含點的個數就行了。

如果出度》1,是肯定沒有答案的。

為什麼是》1,因為當=0時,也就是整個圖都在乙個連通分量中,此時所有點都是可以的。

陣列盡量開大一點,因為a,b的範圍並沒有給,如果a,b太大的話就要用到離散化。

#include#include

#include

#include

using

namespace

std;

const

int maxn=100000+5

;inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}int

n,m,tot,idx,top,cnt,ans,k;

inthead[maxn],u[maxn],v[maxn],du[maxn];

intdfn[maxn],low[maxn],sta[maxn],belong[maxn],num[maxn];

bool

ins[maxn];

struct

node

e[maxn*5

];inline

void add(int

from,int

to)void tarjan(int

x)else

if(ins[to])

low[x]=min(low[x],dfn[to]);

}if(dfn[x]==low[x])

while(x!=y);

}}int

main()

for(int i=1;i<=n;i++)

if(!dfn[i]) tarjan(i);

for(int i=1;i<=m;i++)

if(belong[u[i]]!=belong[v[i]])

du[belong[u[i]]]++;

for(int i=1;i<=cnt;i++)

if(!du[i]) k++,ans=num[i];

if(k>1)

printf(

"%d\n

",ans);

return0;

}

洛谷 P2341 HAOI2006 受歡迎的牛

a 喜歡 b,b 喜歡 c,那麼 a 也喜歡 c。牛欄裡共有 n 頭奶牛,給定一些奶牛之間的愛慕關係,請你算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和 m 第二行到第 m 1行 每行兩個用空格分開的整數 a 和 b,表示 a 喜歡 b 輸出格式 第一行 單獨乙個整數,表示...

洛谷P2341 HAOI2006 受歡迎的牛

每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格分開的整數 a和b,表示...

洛谷P2341 HAOI2006 受歡迎的牛

tarjan縮點,重建圖 自己的做法有點麻煩,其實只要記錄縮點後出度為0的點裡面有多少個點就可以了 如果存在多個出度為0的點,那麼就輸出0 include include include include includeusing namespace std const int maxn 100001...