一.概念
对于一个有向无环图G,其拓扑排序是G中所有节点的一种线性次序,该序列满足如果G包含(u,v),则节点u在拓扑排序中处于v节点的前面
二.算法实现
int topological_sort(int **G,int n) //G用邻接矩阵的方法保存有向图,n存储图的节点数
{
int * Flag=new int[n]; //Flag[i]用来标记Vi是否已被排到序列,若已被排到则Flag[i]=1,否则Flag[i]=0;
int *T_S=new int[n]; //用来保存生成的序列
for(int i=0;i<n;i++)
Flag[i]=0;
int temp=0;
L: for(int i=0;i<n;i++)
{
if(Flag[i]==0)
{
int f=0; //用来标记是否有以Vi为终点的边
for(int j=0;j<n;j++)
{
if(Flag[j]==0)
{
if(*((int*)G+n*j+i)==1) //若有从Vj到Vi的边标记f为1
f=1;
}
}
if(f==0)
{
Flag[i]=1;
T_S[temp]=i;
temp=temp+1;
goto L;
}
}
}
for(int i=0;i<n;i++)
cout<<T_S[i]<<" ";
return 0;
}
三.举例
int main()
{
int G[6][6]={{0,1,1,0,0,0},
{0,0,0,1,0,0},
{0,1,0,0,1,0},
{0,0,0,0,0,1},
{0,0,0,0,0,1},
{0,0,0,0,0,0}};
topological_sort((int **)G,6);
return 0;
}
结果: