/*
名称:拓扑排序
说明:对于拓扑排序来说,其针对的一般是AOV网。其基本的算法(本程序中实现的)类似于广度优先遍历只不过在遍历的时候要修改顶点的入度数量。当某个顶点的入度数量为0时,则说明可以输出其顶点,并把以此顶点为源点的弧删去(也就是以此弧为终点的顶点的入度数减1)。
在本程序中使用的是临接矩阵的结构,时间复杂度为O(V2)。实际上比较好的存储结构是用逆临接表,可以达到O(V+E)的时间复杂度。
*/
#include<iostream>
#include "graph.h"
using namespace std;
//拓扑排序
bool TopologicalSort(MGraph G)
{
int indegree[G.vexnum]; //用来记录每个顶点的入度个数
queue<int > Q; //保存入度为0的顶点
memset(indegree,0,sizeof(indegree)); //初始化为0
int val = 0;
int _count = 0; //用来记录输出的顶点个数
//前期准备:计算个顶点的入读(采用的是临接矩阵)
for(int i = 0;i<G.vexnum;++i)
{
for(int j = 0;j<G.vexnum;++j)
{
if(G.Edge[j][i] > 0 && G.Edge[j][i] < MaxDis)
{
++(indegree[i]); //顶点的入度个数加1
}
}
if(indegree[i] == 0) //将入度为0的顶点推入队列
Q.push(i);
}
while(Q.empty() == false)
{
val = Q.front();
Q.pop();
_count++;
cout<<GetVex1(G,val)<<" "; //输出顶点
for(int p = FirstNeighbor1(G,val); p >= 0;p = NextNeighbor1(G,val,p))
{
if((--indegree[p]) == 0)
Q.push(p);
}
}
if(_count < G.vexnum) //如果最终输出顶点数量小于图的数量,则说明图中有环,排序失败
return false;
else
return true;
}