bzoj1051 受歡迎的牛(tarjan)

2021-07-27 03:34:22 字數 1681 閱讀 8507

1051: [haoi2006]

受歡迎的牛

time limit: 10 sec  memory limit: 162 mb

description

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

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

牛被所有的牛認為是受歡迎的。

input

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

能出現多個a,b)

output

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

sample input

3 31 2

2 12 3

sample output

1

hint

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

題目分析:如果有多個出度為零的點答案就是0,否則就是那個點的size,連新圖重新連邊都不需要。

gdkoi考前敲一下tarjan的模板……

code:

#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn=10010;

const int maxm=50010;

struct data

e[maxm];

data *head[maxn];

int cur=-1;

int dfn[maxn];

int low[maxn];

int time=0;

int sta[maxn];

int sak[maxn];

int tail=0;

int id[maxn];

int size[maxn];

int num=0;

int pout[maxn];

int ans=0;

int n,m;

void add(int x,int y)

void dfs(int node)

if (sta[son]==1) low[node]=min(low[node],low[son]);

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

sta[node]=2;

id[node]=num;

tail--; }}

void tarjan()

int main()

tarjan();

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

if (!pout[i])

if (!ans) ans=i;

else

printf("%d\n",size[ans]);

return 0;

}

BZOJ 1051, 受歡迎的牛

傳送門 求可以被除自己以外所有點遍歷到的點的個數。首先強連通分量跑一遍,縮點之後統計每個強連通分量 可以視為乙個點 的出度。如果有多個出度大於0,則無解 否則輸出唯一出度為0的強連通分量內點的個數。include const int n 10005,m 50005 int n,m,x,y,i,j,t...

bzoj1051 受歡迎的牛

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

bzoj 1051 受歡迎的牛 tarjan

如果a喜歡b,那麼a b連邊,那麼整個圖儲存下來,如果有好多個牛是受歡迎的,那麼他們一定會在乙個環中,所以我們先跑一邊 tarjan縮點,那麼受歡迎的牛群所在的這個點 縮完 其出度為0。所以縮完點後,統計一下每個強聯通分量中有多少個點,記錄每個點有多少出度,若會存在有兩個及以上出度為0的點,那麼表明...