强连通分量 -- Kosaraju算法

本文详细介绍了使用Kosaraju算法寻找图中的强连通分量的过程。通过两次深度优先搜索(DFS),算法能够有效地确定图中所有节点所属的强连通分量,并给出具体实现代码。


#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int SIZE = 100;

int G[SIZE][SIZE];
int GT[SIZE][SIZE];
bool visit[SIZE];
int parent[SIZE];
vector< int >vec;

int nodes;
int edges;


void init(){

    int source, target;

	memset( G,  0, sizeof( G ) );
	memset( GT, 0, sizeof( GT ) );

	cin >> nodes >> edges;

	for( int edge = 1; edge <= edges; ++edge ){

	    cin >> source >> target;

	    G[source][target] = 1;
	    G[target][source] = 1;

	}
}


void DFS_G( int cur ){

	visit[cur] = true;

	for( int node = 1; node <= nodes; ++node ){
		if( G[cur][node] && !visit[node] )
            DFS_G( node );
	}

	vec.push_back( cur );

}


void DFS_GT( int cur, const int& par ){

	visit[cur]  = true;
	parent[cur] = par;

	for( int node = 1; node <= nodes; ++node ){
		if( GT[cur][node] && !visit[node] )
            DFS_GT( node, par );
	}

}


void Kosaraju(){

    int node;
    int count = 0;

	init();
	memset( visit, false, sizeof( visit ) );

	for( node = 1; node <= nodes; ++node ){
		if( !visit[node] )
            DFS_G( node );
	}

	memset( visit, false, sizeof( visit ) );

	for( node = nodes; node >= 1; --node ){
		if( !visit[vec[node - 1]] ){

			DFS_GT( vec[node - 1], count );
			count++;

		}
	}

	cout << count << endl;

}


int main(){

	Kosaraju();

	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值