【UOJ 92】有向图的强连通分量
生活随笔
收集整理的這篇文章主要介紹了
【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】有向图的强连通分量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果一台男生不抽烟、不喝酒、不打牌以及不
- 下一篇: MSCRM二次开发实现自动编号功能