日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Bzoj1051 受欢迎的牛

發(fā)布時(shí)間:2023/12/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bzoj1051 受欢迎的牛 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

每一頭牛的愿望就是變成一頭最受歡迎的牛。現(xiàn)在有 N 頭牛,給你 M 對整數(shù) (A,B),表示牛 A 認(rèn)為牛 B 受歡迎。這種關(guān)系是具有傳遞性的,如果 A 認(rèn)為 B 受歡迎,B 認(rèn)為 C 受歡迎,那么牛 A 也認(rèn)為牛 C 受歡迎。你的任務(wù)是求出有多少頭牛被除自己之外的所有牛認(rèn)為是受歡迎的


第一眼是個(gè)很弱智的Tarjan縮點(diǎn),然后判斷有沒有連通分量的入度為連通分量個(gè)數(shù)減一

但是我把傳遞性想的太簡單了

如果有下圖這樣的,我就只會判定出3號點(diǎn)有一個(gè)入度,但是正確值為2

所以我們換一個(gè)角度,從縮點(diǎn)的性質(zhì)來考慮

我們知道,縮點(diǎn)之后的圖是一個(gè)DAG(有向無環(huán)圖)

所以一個(gè)節(jié)點(diǎn)如果有出度,就不可能被它所到的點(diǎn)崇拜,否則就有環(huán)了

所以我們得出了第一條結(jié)論,只有出度為零的點(diǎn)才能被所有點(diǎn)崇拜

然后有的人會問如果有多個(gè)節(jié)點(diǎn)的出度為零怎么辦呢

即使不從圖的角度來看,這兩個(gè)出度為零的點(diǎn)也是不可能互相崇拜的,所以不成立

下面給出代碼:

#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #include<cmath> using namespace std; inline int rd(){int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';return x*f; } inline void write(int x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');return ; } int n,m; int head[1000006],nxt[1000006],to[1000006]; int total; void add(int x,int y){total++;to[total]=y;nxt[total]=head[x];head[x]=total;return ; } int dfn[1000006]; int low[1000006]; int tot=0; int book[1000006]; int sta[1000006]; int set=0; int v[1000006]; int cnt=0; int color[1000006]; void tarjan(int x){low[x]=dfn[x]=++tot;sta[++set]=x;book[x]=1;for(int e=head[x];e;e=nxt[e]){if(!dfn[to[e]]){tarjan(to[e]);low[x]=min(low[x],low[to[e]]);}else if(book[to[e]]) low[x]=min(low[x],dfn[to[e]]);}if(dfn[x]==low[x]){cnt++;book[x]=0;v[cnt]++;color[x]=cnt;while(set&&sta[set]!=x){book[sta[set]]=0;v[cnt]++;color[sta[set]]=cnt;set--;}set--;}return ; } int du[1000006]; int main(){n=rd(),m=rd();for(int i=1;i<=m;i++){int x=rd(),y=rd();add(x,y);}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);int ans=0;for(int i=1;i<=n;i++){for(int e=head[i];e;e=nxt[e]){if(color[i]!=color[to[e]]){du[color[i]]++;}}}int num=0;for(int i=1;i<=cnt;i++){if(du[i]==0){num++;ans+=v[i];}}if(num==1) write(ans);else write(0);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/WWHHTT/p/9862091.html

總結(jié)

以上是生活随笔為你收集整理的Bzoj1051 受欢迎的牛的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。