时间复杂度:O(n^2)
实现代码:
#include<iostream>
#include<queue>
using namespace std;
//逆拓扑排序
#define ElemType int
#define MaxSize 15
int G[MaxSize][MaxSize]; //邻接矩阵存储图
int out[MaxSize]; //记录每个顶点的出度
int n,m; //顶点数 边数
queue<int>q; //存放出度为0的顶点
int print[MaxSize]; //存放拓扑排序好的序列
int count;
int main(){
cin>>n>>m;
//初始化图
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
G[i][j]=0;
}
}
//构建有向图
for(int i=0;i<m;i++){
int from,to; //边的起点 边的终点
cin>>from>>to;
G[from][to]=1;
out[from]++;
}
//将所有出度为0的顶点入队
for(int i=0;i<n;i++){
if(out[i]==0){
q.push(i);
}
}
while(!q.empty()){
print[count++]=q.front();
for(int i=0;i<n;i++){
if(G[i][q.front()]==1){
out[i]--; //和当前出度为0相连的顶点出的减1
if(out[i]==0){
q.push(i);
}
}
}
q.pop();
}
if(count!=n){
cout<<"逆拓扑排序失败,有向图中有环"<<endl;
}else{ //拓扑排序成功
cout<<"拓扑排序序列为:";
for(int i=0;i<count;i++)
cout<<print[i]<<" ";
}
return 0;
}
/*
输入样例:
5 5
0 1
1 3
2 3
2 4
3 4
输出样例:
拓扑排序序列为:4 3 1 2 0
输入样例:
3 3
0 1
1 2
2 0
输出样例:
逆拓扑排序失败,有向图中有环
*/
运行结果: