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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【UOJ 92】有向图的强连通分量

發布時間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【UOJ 92】有向图的强连通分量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目描述】:

有向圖強連通分量:在有向圖G中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通,稱G是一個強連通圖。有向圖的極大強連通子圖,稱為強連通分量(strongly connected components)。

現在給出一個有向圖。結點個數N(<=1000)(編號1~N),邊數M(<=5000)。請你按照從小到大的順序輸出最大的強連通分量結點編號。

【輸入描述】:

第一行N和M 以下M行,每行兩個空格隔開的整數表示一條有向邊;

【輸出描述】:

輸出一行,最大的強連通分量的結點(由小到大輸出)

【樣例輸入】:

10 20 2 2 5 3 8 5 3 4 8 7 10 10 10 6 7 7 2 8 3 2 8 1 3 8 1 7 8 10 7 5 6 4 9 2 8 6 7 5 1 8

【樣例輸出】:

1 2 3 5 7 8

【時間限制、數據范圍及描述】:

時間:1s 空間:256M

N<=1000, M<=5000

?

tarjan模板如下:

#include "iostream" #include "cstdio" #include "cstdlib" #include "stack" #include "algorithm" using namespace std; #define MAXN 1005 #define MAXM 5005 int n,m;/*********************** 鏈式前向星 ***********************/ struct ENode{int v,w,next; }edge[MAXM]; //邊集 int p[MAXN],ec; //點集和邊集計數 void InsertE(int u, int v, int w){ //插入邊 edge[++ec].v = v; edge[ec].w = w;edge[ec].next = p[u];p[u] = ec; }/***********************Tarjan算法基礎 搜索強連通分量 ***********************/ int dfn[MAXN],cTime,low[MAXN]; //時間戳,時間戳計數,祖先時間。 int gid[MAXN],gc; // 分量數組,分量計數。 bool ins[MAXN]; stack<int> sTar; //入棧標志,輔助棧 void Tarjan(int u){dfn[u]=low[u]=++cTime; //時間戳與祖先時間初始化 ins[u]=1; sTar.push(u); //入棧 for(int i=p[u];i;i=edge[i].next){ //遞歸處理所有子結點 int v=edge[i].v;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]); //利用子孫,更新能回指的祖先時間戳 }else if(ins[v]) //記錄U能回指的最早祖先的時間戳 low[u]=min(low[u],dfn[v]);}if(low[u]>=dfn[u]){ //判斷U是否分量的根 gc++;int i;do{i=sTar.top(); ins[i]=0;gid[i]=gc; sTar.pop(); //分量出棧}while(i!=u); //出棧至當前結點,包括當前結點 } }int main() {freopen("connect.in","r",stdin);freopen("connect.out","w",stdout);int x,y,c=0;cin >> n >> m;for(int i=0;i<m;i++){cin >> x >> y;InsertE(x,y,0);}for(int i=1;i<=n;i++)if(!dfn[i]) Tarjan(i);int a[MAXN]={0};for(int i=1;i<=n;i++){a[gid[i]]++;if(a[gid[i]]>a[a[0]])a[0]=gid[i];}for(int i=1;i<=n;i++)if(gid[i]==a[0])cout << i << ' ';cout << endl;return 0; }

?

轉載于:https://www.cnblogs.com/wuhu-JJJ/p/11139459.html

總結

以上是生活随笔為你收集整理的【UOJ 92】有向图的强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。

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