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