参考kahn
算法的:
https://blog.csdn.net/qq_40691051/article/details/103145110
#include<iostream>
#include<list>
#include<vector>
#include<queue>
using namespace std;
class Graph
{
int n; //顶点数
list<int> *adj; //邻接表
void allTopologicalSortUtil(bool visited[], int indegree[], vector<int> &ans);
public:
Graph(int _n) { n = _n; adj = new list<int>[_n];}
~Graph(){ delete [] adj; }
void addEdge(int v, int w){ adj[v].push_back(w); }
void allTopologicalSort();
};
void Graph::allTopologicalSortUtil(bool visited[], int indegree[], vector<int> &ans)
{
if( ans.size() == n) //找到一种
{
for(int i = 0; i < n ; i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
return ;
}
for(int i = 0; i < n; i++)
{
if(indegree[i] == 0 && !visited[i])
{//处理本分支上入度为一,还没访问过的节点
list<int>::iterator j;
for(j = adj[i].begin(); j != adj[i].end(); j++)
{//令i的所有邻居的入度减一
indegree[*j]--;
}
visited[i] = true;
ans.push_back(i);
allTopologicalSortUtil(visited, indegree, ans);
//访问一条分支后,把入度恢复回来
for(j = adj[i].begin(); j != adj[i].end(); j++)
{
indegree[*j]++;
}
visited[i] = false;
ans.pop_back();
}
}
}
void Graph::allTopologicalSort()
{
bool *visited = new bool[n];
int *indegree = new int[n];
vector<int> ans;
for(int i = 0; i < n; i++)
{
visited[i] = false;
indegree[i] = 0;
}
for(int i = 0; i < n; i++) //计算每个顶点的入度
{
list<int>::iterator it;
for(it = adj[i].begin(); it != adj[i].end(); it++)
{
indegree[*it]++;
}
}
allTopologicalSortUtil(visited, indegree, ans);
}
int main()
{
Graph g(6);
g.addEdge(4, 2);
g.addEdge(4, 0);
g.addEdge(5, 0);
g.addEdge(5, 1);
g.addEdge(2, 3);
g.addEdge(3, 1);
cout << "这个图所有的拓扑排序是:\n";
g.allTopologicalSort();
return 0;
}