每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數(a,b),表示牛a認為牛b受歡迎。 這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。
第一行兩個數n,m。 接下來m行,每行兩個數a,b,意思是a認為b是受歡迎的(給出的資訊有可能重複,即有可能出現多個a,b)
乙個數,即有多少頭牛被所有的牛認為是受歡迎的。
3 31 2
2 12 3
1100%的資料n<=10000,m<=50000
tarjan+縮點,最後答案為出度為0的sum,如果有多個出度為0的點,那麼答案為0.
//serene#include#include#include#include#include#includeusing namespace std;
const int maxn=1e4+10,maxm=5e4+10;
int n,m;
bool cd[maxn];
int aa,ff;char cc;
int read()
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa*ff;
}int fir[maxn],nxt[maxm],to[maxm],e=0;
void add(int x,int y)
int zz[maxn],id[maxn],top[maxn],d=0,t=0;
bool vis[maxn],inz[maxn];
int xd[maxn],sum[maxn],tot;
void tj(int pos)
tj(z); top[pos]=min(top[pos],top[z]);
} if(top[pos]==id[pos]) }}
int main()
tj(1);
for(int i=1;i<=n;++i) for(int y=fir[i];y;y=nxt[y])
for(int i=1;i<=tot;++i) if(!cd[i])
ans=sum[i];
} printf("%d",ans);
return 0;
}
BZOJ 1051, 受歡迎的牛
傳送門 求可以被除自己以外所有點遍歷到的點的個數。首先強連通分量跑一遍,縮點之後統計每個強連通分量 可以視為乙個點 的出度。如果有多個出度大於0,則無解 否則輸出唯一出度為0的強連通分量內點的個數。include const int n 10005,m 50005 int n,m,x,y,i,j,t...
bzoj1051 受歡迎的牛(tarjan)
1051 haoi2006 受歡迎的牛 time limit 10 sec memory limit 162 mb description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這 種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎...
bzoj 1051 受歡迎的牛 tarjan
如果a喜歡b,那麼a b連邊,那麼整個圖儲存下來,如果有好多個牛是受歡迎的,那麼他們一定會在乙個環中,所以我們先跑一邊 tarjan縮點,那麼受歡迎的牛群所在的這個點 縮完 其出度為0。所以縮完點後,統計一下每個強聯通分量中有多少個點,記錄每個點有多少出度,若會存在有兩個及以上出度為0的點,那麼表明...