求强连通分支 tarjan算法

来源:互联网 发布:读写分离 mysql原理 编辑:程序博客网 时间:2024/05/01 03:27
#include <iostream>#include <cstdio>#include <vector>using namespace std;const int maxn = 10;int tree[maxn];int dfn[maxn];vector<int>g[maxn];int n, m;int temp[maxn];int top;int sta[maxn];void init() {   for (int i = 1; i <= n; i ++) {      g[i].clear();      temp[i] = 0;   }}void tarbfs(int k, int lay, int& scc_num) {     temp[k] = 1;     tree[k] = lay;     dfn[k] = lay;     sta[++top] = k;     for (int i = 0; i < (int)g[k].size(); i ++) {        if (temp[g[k][i]] == 0) {            tarbfs(g[k][i], ++lay, scc_num);        }        if (temp[g[k][i]] == 1) tree[k] = min(tree[k], tree[g[k][i]]);     }     if (dfn[k] == tree[k]) {        ++scc_num;        do {            tree[sta[top]] = k;  //极大强连通分支缩点            temp[sta[top]] = 2;        }while (sta[top--] != k);     }}int tarjan() {    int lay = 1;    int scc_num = 0;    top = 0;    for (int i = 1; i <= n; i ++) {        if (temp[i] == 0) {            tarbfs(i, lay, scc_num);        }    }return scc_num;}int main() {    while (cin >> n >> m) {        init();        int x, y;        for (int i = 0; i < m; i ++) {            scanf("%d%d", &x, &y);            g[x].push_back(y);        }        cout << tarjan() <<endl;        for (int i = 1; i <= n; i ++) {            cout << i<<"---->"<<tree[i]<<endl;        }    }return 0;}

0 0
原创粉丝点击