bzoj1051 HAOI2006 受歡迎的牛

2021-07-10 02:22:43 字數 1194 閱讀 4655

bzoj1051

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

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

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

3 3

1 2

2 1

2 3100%的資料n<=10000,m<=50000

先構圖,如果不連通直接輸出0。

我們用tarjan將強連通分量縮成乙個點,這樣就得到了乙個有向無環圖。所有出度為0的點所代表的的強連通分量的大小就是答案。

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define n 10010

int dfn[n],low[n],t[n],size[n],p[n],first[n];

int tot,n,m,x,y,cnt,top,num,ans;

bool f[n],v[n];

struct edgee[n*5];

void count(int x)

p[x]=num; f[x]=false;

top--;

}void tarjan(int x)

else

if(f[e[i].x]) low[x]=min(low[x],low[e[i].x]);

if(dfn[x]==low[x]) count(x);

}int main()

tarjan(1);

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

if(p[e[i].x]!=p[e[i].from])

f[p[e[i].from]]=true;

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

if(!f[i]) ans+=size[i];

printf("%d\n",ans);

return

0;}

BZOJ1051 HAOI2006受歡迎的牛

請原諒我,這題實在和bzoj1093太像 了,copy過來改一改,很多沒有用,然後一起嘿嘿嘿 include include include include include include include using namespace std typedef long long ll inline...

bzoj1051 HAOI2006 受歡迎的牛

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

bzoj1051 HAOI2006 受歡迎的牛

題目 哇,csdn部落格 改版了,還有什麼優質博主搶先體驗版,手賤點了試用,哇塞,好。醜。不過據說全部都要改,這樣我的心情就好了許多。再來看這道題,比較經典的tarjan縮點題。先用tarjan縮點,點內每乙個小點都能互相到達。大點之間建有向邊,如果只存在乙個大點的出度為0,那麼它的大小就是答案。存...