c_cpp 强大的连接组件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 强大的连接组件相关的知识,希望对你有一定的参考价值。
//https://www.geeksforgeeks.org/strongly-connected-components/
#include<iostream>
#include<list>
#include<stack>
using namespace std;
class graph {
int v;
list<int> *adj;
public:
graph(int v){
this->v= v;
adj= new list<int> [v];
}
void addEdge(int u, int w);
void print();
void dfs();
void dfsUtil (int s, bool visited[]);
void printSCC();
void fillOrder (int s, bool visited[], stack<int> &st);
graph getTranspose();
};
void graph::addEdge(int u, int w) {
adj[u].push_back(w);
}
void graph::print() {
list<int>:: iterator j;
for (int i=0; i<v;i++) {
cout<< i << " : ";
for (j=adj[i].begin(); j!= adj[i].end();++j)
cout<< *j << "-";
cout<< "\n";
}
}
void graph::dfs() {
bool visited[v]={0};
for (int i=0; i<v;i++)
if (visited[i]== 0)
dfsUtil(i, visited);
}
void graph::dfsUtil(int s, bool visited[]) {
visited[s]= 1;
cout<< s<< " ";
list<int>::iterator i;
for (i= adj[s].begin(); i!= adj[s].end();++i)
if (visited[*i]==0)
dfsUtil(*i, visited);
}
graph graph::getTranspose() {
graph gr(v);
for (int i=0; i<v;i++) {
list<int>::iterator j;
for (j=adj[i].begin(); j!= adj[i].end(); ++j)
gr.addEdge(*j,i);
}
return gr;
}
void graph::fillOrder(int s, bool visited[], stack<int> &st) {
list<int>::iterator i;
visited[s]=1;
for (i=adj[s].begin();i!= adj[s].end();++i)
if (visited[*i]==0)
fillOrder(*i, visited, st);
st.push(s);
}
void graph::printSCC() {
stack<int> st;
bool visited[v]= {0};
for (int i=0; i<v; i++)
if (!visited[i])
fillOrder(i, visited, st);
graph gr= getTranspose();
for(int i = 0; i < v; i++)
visited[i] = false;
while (!st.empty()) {
int v=st.top();
st.pop();
if (!visited[v]) {
gr.dfsUtil(v,visited);
cout<< "\n";
}
}
}
int main() {
graph g(5);
g.addEdge(1, 0);
g.addEdge(0, 2);
g.addEdge(2, 1);
g.addEdge(0, 3);
g.addEdge(3, 4);
g.print();
g.printSCC();
}
以上是关于c_cpp 强大的连接组件的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 使用带有listS的Boost Graph连接组件
c_cpp 组件实体样本
JDBC连接池监控组件(Druid)
c_cpp 套接字连接
c_cpp 使用宏来连接堆对象
c_cpp WiFi的连接器helper.ino