#include "iostream"
#include "stack"
#include "vector"
#include "string.h"
using namespace std;
const MAX_V = 100;
vector<int> G[MAX_V]; //图的邻接表
vector<int> rG[MAX_V]; //反向图的邻接表
int visit[MAX_V]; //访问标记
int cmp[MAX_V]; //所属强连通分量的拓扑排序
vector<int> vs; //后序遍历的顶点列表
int V = 12; //顶点数
void addEdge(int from, int to)
{
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v)
{
visit[v] = 1;
for(int i=0; i<G[v].size(); i++)
if(!visit[G[v][i]])
dfs(G[v][i]);
vs.push_back(v);
}
void rdfs(int v, int k)
{
visit[v] = 1;
cmp[v] = k;
for(int i=0; i<rG[v].size(); i++)
if(!visit[rG[v][i]])
rdfs(rG[v][i], k);
}
int scc()
{
memset(visit, 0, sizeof(visit));
vs.clear();
int i;
for(i=0; i<V; i++)
if(!visit[i])
dfs(i);
memset(visit, 0, sizeof(visit));
int k = 0;
for(i=vs.size()-1; i>=0; i--) //越是尾部的结点编号越小
if(!visit[vs[i]])
rdfs(vs[i], k++);
return k;
}
int main()
{
int G1[12][12] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}
};
int i, j;
for(i=0; i<V; i++)
for(j=0; j<V; j++)
if(G1[i][j] == 1)
addEdge(i, j);
cout << "压缩图的顶点个数:" << scc() << endl;
cout << "新的顶点编号" << endl;
for(i=0; i<V; i++)
cout << i+1 << ": " << cmp[i]+1 << endl;
return 0;
}
强连通分量分解
最新推荐文章于 2021-11-05 11:42:31 发布