HAOI2006 受歡迎的牛

2022-04-30 07:24:10 字數 1609 閱讀 6742

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

歡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了)。首先tarjan縮點,如果兩個強連通分量有連邊,重新建邊,如果乙個強連通分量能被其他所有強連通分量抵達,那麼該強連通分量中的所有點都是「明星」。這時候很容易發現乙個簡單的結論:圖中當且僅當乙個強連通分量的出度為0時,該強連通分量中所有的點都是「明星」。

1 #include2 #include3 #include4

using

namespace

std;

5int n,m,x1[1000001],y1[1000001

],sum,ans,num;

6int belong[10000001

],time,top;

7int head[10000001],tot,sta[10000001],number[1000001],headd[100001];8

int dfn[1000001],low[1000001],vis[1000001],dis[10000001];9

struct

nodemp[1000001],mp2[1000001

];13

void add(int u,int

v)14

19void add2(int u,int

v)20

25void tarjan(int

x)26

38else

if(vis[v]) low[x]=min(low[x],dfn[v]);39}

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

4151}52

}53void

work()

5462

if(du==1) //

滿足結論輸出答案

6367 cout<<0

<68return;69

}70intmain()

7178

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

7982 tot=0;83

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

8488

work();

89return0;

90 }

HAOI2006 受歡迎的牛

題目 分析 tarjan縮點。最後如果只有乙個出度為0的點,則答案就是這個點包含的牛數,否則為0.一開始最後統計的時候寫了dfs,後來發現是錯誤的,反例 include include include include include using namespace std const int tma...

HAOI2006 受歡迎的牛

這個就是強連通,計算出度為0的點就好 也沒森麼其它好講的啦 提交傳送們 description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多...

HAOI2006 受歡迎的牛

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