首先按dfs的思路就是列舉所有牛,然後再列舉所有牛,看能不能到達
但這個題做法比較特殊,不是從暴力優化的角度推得出的
需要從 對單個牛的角度轉變為 對所有牛的角度入手
如果答案是多隻牛,那這多隻牛一定是可以互達的
所以就可以縮環,然後如果有點出度為0,由於縮過環,所以不可能再回來
然後就是掃一遍統計答案+判斷了
碼:#include#include#includeusing namespace std;
#define n 10005
#define m 50005
int tot,zhong[m],zhong2[m],hou[m],hou2[m],xia[n],xia2[n],up[n],jh[n],jhs,gs[n],dfn[n],top,sta[n],n,m,i,j,ans,st,a,b;
void jia(int a,int b)
void jia2(int a,int b)
void tarjan(int o)
{// cout<
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受歡迎...