有向グラフの強連結成分の解決:Kosarajuアルゴリズム

1.強連結成分の紹介:
有向グラフGでは、2つの頂点vi,vj間にviからvjへの有向パスがあり、vjからviへの有向パスもある場合、2つの頂点が強く接続されています有向グラフGの2つすべての頂点が強く接続されている場合、Gは強連結グラフ有向グラフの最大強連結サブグラフは強連結成分と呼ばれます

次のように強連結成分を解決する方法:
2、Kosarajuアルゴリズム:
:事実上のアルゴリズムに基づく図逆数G^T(図面の各側に反対方向を有する)と画像がG。すなわち、同一の構成要素とを接続し、頂点場合stGDAは場合にのみ、相互であるstG^Tクロスです。
2.1。アルゴリズムのステップと概略図:ステップ
1:元の画像Gの深さ優先トラバーサル各ノードの出発時刻を記録します。
ステップ2:出発時刻が最も遅い頂点を選択し、逆グラフをG^Tトラバースし、トラバース可能な頂点を削除します。これらの頂点は、強い接続コンポーネントを構成します。
ステップ3:削除されていない頂点がある場合は、ステップ2に進みます。それ以外の場合は、アルゴリズムが終了します。
図1:元の画像
図1:元のグラフG
ここに画像の説明を挿入
図2:dfsを含むグラフG
ここに画像の説明を挿入
図3:逆グラフG ^ T
図2
図4:強い連結成分を取得するための逆グラフdfs ==(逆グラフは、最新の出発ノードをDFSの開始点として、ノードは強く接続されたコンポーネントを構成します)==

2.2。C ++コード:

#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=110;
int n; // 节点个数
bool flag[MAXN];//访问标志数组
int belg[MAXN];//存储强连通分量,其中belg[i]表示顶点i属于第belg[i]个强连通分量
int numb[MAXN];//结束时间标记,其中numb[i]表示离开时间为i的顶点
int G[MAXN][MAXN],GT[MAXN][MAXN]; //邻接矩阵,逆邻接矩阵
AdjTableadj[MAXN],radj[MAXN];//邻接表,逆邻接表
//用于第一次深搜,求得numb[1..n]的值
voidVisitOne(int cur,int &sig) // 访问原图
{
    
    
    flag[cur]=true;
    for(int i=0; i<n; ++i)
        if(G[cur][i] && flag[i] == false)
            VisitOne(i,sig);
    numb[++sig]=cur; //其中numb[i]表示离开时间为i的顶点
}
//用于第二次深搜,求得belg[1..n]的值
voidVisitTwo(int cur,int count) //访问逆图
{
    
    
    flag[cur]=true;
    belg[cur]=count;
    for(int i=0; i<n; ++i)
        if(GT[cur][i] && flag[i] == false)
            VisitOne(i,count);
}
//Kosaraju算法,返回为强连通分量个数
int Kosaraju_StronglyConnectedComponent()
{
    
    
    int sig=0;// sig代表离开时间
    //第一次深搜
    memset(flag,0,sizeof(bool)*n); //访问标志设为false
    for(int i=0; i<n; i++) 
        if( flag[i] == false)
            VisitOne(i,sig);
    //第二次深搜
    memset(flag,0,sizeof(bool)*n); //访问标志设为false
    int count=0; // count为强连通分量个数
    for(int i=n; i>0; --i)
        if(flag[numb[i]] == false) //频率最高的顶点若没访问
            VisitTwo(numb[i],++count);
    return count;
}

参考資料:
Baiduの百科事典:kosarajuアルゴリズム
B、強い連結成分
C、アルゴリズム導入部22.5強い連結成分

3. TarjanアルゴリズムとGabowアルゴリズム
これら2つはまだ学習していません。興味がある場合は、Baidu Encyclopedia:Strong Connected Componentsのリンク参照してください。

総括する:

1. Kosarajuアルゴリズム:逆グラフは、最新の出発ノードをDFSの開始点として使用し、通過したノードは強い接続コンポーネントを形成します。

おすすめ

転載: blog.csdn.net/qq_33726635/article/details/106016480