B1051 受歡迎的牛 tarjan縮點

2022-03-13 06:03:07 字數 1938 閱讀 2656

就是一道tarjan縮點的板子,之前在洛谷做過。但是我發現乙個事,就是函式裡面有一句話:

void tarjan(int

x)

else

if(vis[y])

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

while(x !=v);}}

其中有一段:

if(!dfn[y])

else

if(vis[y])

但是變成:

if(!dfn[y])

else

if(vis[y])

也是能ac的,然後我又試了一開始的那個板子題,直接改好像也可以。。。為什麼,或者這麼寫到底對不對,有人知道嗎?歡迎大佬指點。

題幹:

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 input33

1221

23sample output

1hint

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

**:

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

#define duke(i,a,n) for(int i = a;i <= n;i++)

#define lv(i,a,n) for(int i = a;i >= n;i--)

#define clean(a) memset(a,0,sizeof(a))

const

int inf = 1

<< 30

;typedef

long

long

ll;typedef

double

db;template

void read(t &x)

template

void

write(t x)

int lst[50010],dfn[50010],low[50010],n,m,tot = 0,str[50010],top = 0,vis[50010

];int num[50010],chu[50010],col[50010],len = 0

,ans;

struct

node

a[50010

];void add(int x,int

y)void tarjan(int

x)

else

if(vis[y])

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

while(x !=v);

}}int

main()

duke(i,

1,n)

duke(i,

1,n)}}

int tot = 0,f = 0

; duke(i,

1,ans)

if(tot >= 2

)

}printf(

"%d\n

",num[f]);

return0;

}

**

bzoj1051 受歡迎的牛 結論 tarjan

首先按dfs的思路就是列舉所有牛,然後再列舉所有牛,看能不能到達 但這個題做法比較特殊,不是從暴力優化的角度推得出的 需要從 對單個牛的角度轉變為 對所有牛的角度入手 如果答案是多隻牛,那這多隻牛一定是可以互達的 所以就可以縮環,然後如果有點出度為0,由於縮過環,所以不可能再回來 然後就是掃一遍統計...

BZOJ 1051, 受歡迎的牛

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

tarjan BZOJ 1051 受歡迎的牛

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