问题描述
有向图作为输入给出,在输出中,我需要指出输入图及其缩合图的所有SCC。我编写了Graph类和Kosarayu算法,以在有向图中找到强连接的组件。问题是-我如何找到和指出有向图的图凝聚?我想到的一种解决方案没有考虑边缘的方向(可能不会在线性时间内进行)。
graph.h
#include <list>
#include <stack>
class Graph
{
public:
Graph(std::size_t vertex);
~Graph();
void addEdge(std::size_t from,std::size_t to);
Graph getTranspose();
void kosarajuSSC();
private:
std::size_t vertex_;
std::list<int>* adjList_;
void fillPostVisitOrder(std::size_t vertex,bool visited[],std::stack<int>& stack);
void auxiliaryDFS(std::size_t vertex,bool visited[]);
};
graph.cpp
#include "graph.h"
#include <iostream>
Graph::Graph(std::size_t vertex)
{
vertex_ = vertex;
adjList_ = new std::list<int>[vertex];
}
Graph::~Graph()
{}
void Graph::addEdge(std::size_t from,std::size_t to)
{
adjList_[from].push_back(to);
}
Graph Graph::getTranspose()
{
Graph graph(vertex_);
for (std::size_t i = 0; i < vertex_; ++i)
{
std::list<int>::iterator j;
for (j = adjList_[i].begin(); j != adjList_[i].end(); ++j)
{
graph.adjList_[*j].push_back(i);
}
}
return graph;
}
void Graph::kosarajuSSC()
{
std::stack<int> vertexStack;
bool* visited = new bool[vertex_];
for (std::size_t i = 0; i < vertex_; ++i)
{
visited[i] = false;
}
for (std::size_t i = 0; i < vertex_; ++i)
{
if (!visited[i])
{
fillPostVisitOrder(i,visited,vertexStack);
}
}
Graph transposeGraph = getTranspose();
for (std::size_t i = 0; i < vertex_; ++i)
{
visited[i] = false;
}
std::size_t counterSCC = 0;
while (!vertexStack.empty())
{
std::size_t currVertex = vertexStack.top();
vertexStack.pop();
if (!visited[currVertex])
{
std::cout << "SCC " << counterSCC++ << ": ";
transposeGraph.auxiliaryDFS(currVertex,visited);
std::cout << '\n';
}
}
}
void Graph::fillPostVisitOrder(std::size_t vertex,std::stack<int>& stack)
{
visited[vertex] = true;
for (std::list<int>::iterator i = adjList_[vertex].begin(); i != adjList_[vertex].end(); ++i)
{
if (!visited[*i])
{
fillPostVisitOrder(*i,stack);
}
}
stack.push(vertex);
}
void Graph::auxiliaryDFS(std::size_t vertex,bool visited[])
{
visited[vertex] = true;
std::cout << vertex << " ";
for (std::list<int>::iterator i = adjList_[vertex].begin(); i != adjList_[vertex].end(); ++i)
{
if (!visited[*i])
{
auxiliaryDFS(*i,visited);
}
}
}
main.cpp
#include <iostream>
#include "graph.h"
int main()
{
Graph g(9);
g.addEdge(0,1);
g.addEdge(1,2);
g.addEdge(2,3);
g.addEdge(2,4);
g.addEdge(3,0);
g.addEdge(4,5);
g.addEdge(5,6);
g.addEdge(6,4);
g.addEdge(7,6);
g.addEdge(7,8);
std::cout << "\nFollowing are strongly connected components in "
"given graph \n";
g.kosarajuSSC();
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)