HAOI2006 受歡迎的牛

2021-08-09 08:47:12 字數 1796 閱讀 3367

[haoi2006]受歡迎的牛

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數(a,b),表示牛 a 認為牛

b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。

第1行兩個整數n,m;

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

乙個數,即有多少頭牛被所有的牛認為是受歡迎的。

3 3 1 2 2 1 2 3

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

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

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

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

1/*2

明顯tarjan縮點

3輸入可能重複 那就只好從出度下手

4跑縮點後的圖

5找沒有出度的點

6若只有乙個這樣的點 就輸出數量

7否則就為0

8因為若有兩個這樣的點

9那麼沒有牛是被所有牛所喜愛的 自己想一想吧

10*/

11 #include 12 #include 13

14const

int maxn=10010;15

const

int maxm=50010;16

17int

n,m,cnt,top,id;

1819

intdfn[maxn],low[maxn];

2021

int stack[maxn],belong[maxn],in

[maxn],sum[maxn];

2223

bool

vis[maxn];

2425

struct

edg ;

29 edg e[maxm<<1

];30

31int

head[maxn],tot;

3233 inline void read(int&x)

3940 inline int min(int a,int

b) 43

44 inline void add(int x,int

y) 49

50void tarjan(int

u) 60

else

if(vis[v]) low[u]=min(low[u],dfn[v]);61}

62if(dfn[u]==low[u]) while(u!=t);72}

73return;74

}7576int

hh()

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

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

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

87for(register int j=head[i];j;j=e[j].next) 92}

93int ans=0,tot=0,t=0;94

for(register int i=1;i<=id;++i)

95if(!in[i]) ++tot,ans+=sum[i];

96 printf("

%d\n

",tot==1?ans:t);

97return0;

98}

99100

int sb=hh();

101int main()

**

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 受歡迎的牛

1051 haoi2006 受歡迎的牛time limit 10 sec memory limit 162 mb submit 7267 solved 3868 submit status discuss 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受...