BZOJ 1051 受歡迎的牛(Tarjan縮點)

2022-02-27 13:42:43 字數 1263 閱讀 7586

time limit: 10 sec  memory limit: 162 mb

submit: 4573  solved: 2428

[submit][status][discuss]

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

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

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

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

能出現多個a,b)

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

3 31 22 1

2 31

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

做法:tarjan縮點後,由於縮點後必定是乙個dag或者叫有向無環圖,因此應該至少存在乙個出度為0的縮點和乙個入度為0的縮點,這題就是要統計出度為0的分量個數

若統計的數量有為1個,則說明全在乙個連通分量內,即任意兩點互相可達,所有牛都是受歡迎的;若大於1,則說明至少乙個連通分量中的牛的數量少於n-1即歡迎不能直接或間接地全部集中在至少一頭牛身上,就沒有牛受歡迎了

**:

#include #include using namespace std;

#define inf 0x3f3f3f3f

#define clr(arr,val) memset(arr,val,sizeof(arr))

#define lc(x) (x<<1)

#define rc(x) ((x<<1)+1)

#define mid(x,y) ((x+y)>>1)

typedef pairpii;

typedef long long ll;

const double pi=acos(-1.0);

const int n=10010;

const int m=50010;

struct edge

;edge e[m];

int head[n],tot;

int dfn[n],low[n],st[n],belong[n],ins[n],sc,ts,top,scnum[n];

int out[n];

void init()

inline void add(int s,int t)

void tarjan(int u)

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...

bzoj1051 受歡迎的牛(tarjan)

1051 haoi2006 受歡迎的牛 time limit 10 sec memory limit 162 mb description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這 種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎...