c_cpp 所有拓扑种类的有向无环图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 所有拓扑种类的有向无环图相关的知识,希望对你有一定的参考价值。

//https://www.geeksforgeeks.org/all-topological-sorts-of-a-directed-acyclic-graph/
#include <bits/stdc++.h>
using namespace std;

class graph {
    int v;
    list<int> *adj;
    vector<int> indegree;
public:
    graph (int v) {
        this->v= v;
        adj= new list<int> [v];
        for (int i=0;i<v; i++)
            indegree.push_back(0);

    }
    void addEdge (int u, int w) {
        adj[u].push_back(w);
        indegree[w]++;
    }
    void TS();
    void TSUtil (bool [], vector<int> &);
};
void graph::TSUtil(bool visited[], vector <int> &res) {
    bool flag= false;

    for (int i=0;i<v; i++) {
        if (indegree[i]==0 && !visited[i]) {
            list<int>::iterator j;
            for (j= adj[i].begin(); j!= adj[i].end(); ++j)
                indegree[*j]--;

            res.push_back(i);
            visited[i]= 1;
            TSUtil(visited, res);

            visited[i]=0;
            res.erase(res.end()-1);
            for (j= adj[i].begin(); j!= adj[i].end(); ++j)
                indegree[*j]++;
            flag= 1;
        }
    }
    if (!flag) {
        for (int i = 0; i < res.size(); i++)
            cout << res[i] << " ";
        cout << endl;
    }
}
void graph::TS() {
    bool visited[v]= {0};
    vector<int> res;

    TSUtil(visited, res);
}

int main() {
    graph g(6);

    g.addEdge(5, 2);
    g.addEdge(5, 0);
    g.addEdge(4, 0);
    g.addEdge(4, 1);
    g.addEdge(2, 3);
    g.addEdge(3, 1);

    g.TS();
}

以上是关于c_cpp 所有拓扑种类的有向无环图的主要内容,如果未能解决你的问题,请参考以下文章

有向无环图

有向无环图的判定及拓扑排序

一个有向无环图的拓扑排序序列是唯一的么

[Nowcoder] 有向无环图 | 拓扑排序简单应用

拓扑排序讲解

拓扑排序--是否为有向无环图