强连通分量 -- Kosaraju算法
2013-12-01 15:40
337 查看
#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;
}
#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;
}
相关文章推荐
- 强连通分量 Kosaraju算法
- [图论] 有向图强连通分量 (kosaraju算法,Tarjan算法)
- 强连通分量 Kosaraju算法
- 强连通分量(Kosaraju算法)
- poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
- 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
- 求有向图的强连通分量个数 之 Kosaraju算法
- 强连通分量——[Kosaraju算法]
- 强连通分量——Kosaraju算法
- Kosaraju算法解析: 求解图的强连通分量
- 一句话之--tarjan算法、kosaraju算法,求强连通分量
- 有向图的强连通分量之Kosaraju算法
- 有向图强连通分量的Tarjan算法和Kosaraju算法
- 强连通分量_Kosaraju算法
- 强连通分量——kosaraju算法
- 强连通分量-kosaraju算法
- 强连通分量Kosaraju算法
- 强连通分量的Kosaraju算法
- 求强连通分量——Tarjan、Kosaraju算法
- 强连通分量(SCC)Kosaraju算法学习笔记