強連通分量

來源:互聯網
上載者:User

Kosaraju演算法求有向圖強連通分量。

看了一下,這裡
講得比較詳細。

#include <stdio.h>#include <string.h>#include <vector>using namespace std;/*num[]記錄訪問頂點序列stc[]記錄頂點所屬連通分支E1[]原圖E2[]反圖visited[]雜湊已訪問頂點*/const int MaxN = 101;typedef vector < int > edge;edgeE1[MaxN] , E2[MaxN];int num[MaxN] , stc[MaxN] , cnt;bool visited[MaxN];void DFS(int vex){visited[vex] = true;for (int i = 0;i < E1[vex].size();i ++){if (!visited[E1[vex][i]]){DFS(E1[vex][i]);}}num[cnt ++] = vex;}void DFS(int vex , const int &anc){visited[vex] = true;stc[vex] = anc;for (int i = 0;i < E2[vex].size();i ++){if (!visited[E2[vex][i]]){DFS(E2[vex][i] , anc);}}}void init(){cnt = 0;int i , j , n , m , a , b;scanf("%d%d" , &n , &m);for (i = 0;i < n;i ++){E1[i].clear();E2[i].clear();visited[i] = 0;}for (i = 0;i < m;i ++){scanf("%d%d" , &a , &b);E1[a].push_back(b);E2[b].push_back(a);}for (i = 0;i < n;i ++){if (!visited[i]){DFS(i);}}memset(visited , 0 , sizeof(visited));for (i = n - 1;i >= 0;i --){if (!visited[num[i]])DFS(num[i] , num[i]);}}void __test(){init();puts("各頂點所屬的強連通分量:");for (int i = 0;i < cnt;i ++){printf("%d " , stc[i]);}puts("");}int main(){__test();}/*9 80 11 21 42 70 33 55 60 84 70 10 32 02 12 33 03 2*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.