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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ2186 强联通

發布時間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ2186 强联通 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 有一群老牛,給你一些關系,a b表示牛a仰慕牛b,最后問你有多少個牛是被所有牛仰慕的。

思路:

? ? ? 假如這些仰慕關系不會出現環,那么當且僅當只有一只牛的出度為0的時候答案才是1,都則就是0,再假設所有的關系正好組成了一個環,那么就是說明每只牛都沒其他所有牛仰慕,那么答案就是n,所以我們可以像強聯通縮點之后看是否有且僅有一個出度為0的,如果有那么答案就是那個強聯通分量的元素個數,否則就是0,因為同一個強聯通里面的點有著相同的性質.


#include<stdio.h> #include<string.h> #include<stack>#define N_node 10000 + 100 #define N_edge 50000 + 500using namespace std;typedef struct {int to ,next; }STAR;typedef struct {int a ,b; }EDGE;STAR E1[N_edge] ,E2[N_edge]; EDGE edge[N_edge]; int list1[N_node] ,list2[N_node] ,tot; int Belong[N_node] ,cont; int out[N_node] ,sum[N_node]; int mark[N_node]; stack<int>st;void add(int a ,int b) {E1[++tot].to = b;E1[tot].next = list1[a];list1[a] = tot;E2[tot].to = a;E2[tot].next = list2[b];list2[b] = tot; }void DFS1(int s) {mark[s] = 1;for(int k = list1[s] ;k ;k = E1[k].next){int to = E1[k].to;if(!mark[to])DFS1(to);}st.push(s); }void DFS2(int s) {Belong[s] = cont;sum[cont] ++;mark[s] = 1;for(int k = list2[s] ;k ;k = E2[k].next){int to = E2[k].to;if(!mark[to]) DFS2(to);} }int main () {int n ,m ,a ,b ,i;while(~scanf("%d %d" ,&n ,&m)){memset(list1 ,0 ,sizeof(list1));memset(list2 ,0 ,sizeof(list2));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);add(a ,b);edge[i].a = a;edge[i].b = b;}while(!st.empty())st.pop();memset(mark ,0 ,sizeof(mark));for(i = 1 ;i <= n ;i ++)if(!mark[i])DFS1(i); cont = 0;memset(mark ,0 ,sizeof(mark));memset(sum ,0 ,sizeof(sum));while(!st.empty()){int to = st.top();st.pop();if(!mark[to]){cont ++;DFS2(to);}}memset(out ,0 ,sizeof(out));for(i = 1 ;i <= m ;i ++){a = Belong[edge[i].a];b = Belong[edge[i].b];if(a == b) continue;out[a] ++;}int ss = 0 ,mk = -1;for(i = 1 ;i <= cont ;i ++){if(!out[i]){ss ++;mk = i;}}if(ss == 1) printf("%d\n" ,sum[mk]);else printf("0\n");}return 0; }

總結

以上是生活随笔為你收集整理的POJ2186 强联通的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。