拓扑排序的方法和步骤:
(1)在图中选一个没有前趋的顶点并输出之
(2)删除该顶点及由它发出的各边,直到图中不存在没有前趋的顶点为止。
若图中存在回路,拓扑排序无法进行。
以下是将一AOV网进行拓扑排序的算法:
题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2367
#include<iostream>
using namespace std;
int m,x,y,value,rear,PNum,point;
const int Max=1000;
int visit[Max];
int vexnum[Max];
int queue[Max];
struct Node{
int id;
Node *next;
}*Graph[Max];
void CreateGraph_Y(){
for(int i=1;i<=PNum;i++){
x=i;
while(cin>>y&&y!=0){
Node *p;
p=new Node;
p->id=y;
p->next=Graph[x];
Graph[x]=p;
vexnum[y]++;
}
}
}
int Topologicalsort()
{
int k;
rear=0;
for(int i=1;i<=PNum;i++)
{
if(vexnum[i]==0)
{
queue[rear++]=i;
cout<<queue[rear-1]<<" ";
}
}
while(rear!=0)
{
Node*p=Graph[queue[rear-1]];
k=queue[rear-1];
rear--;
while(p!=NULL)
{
vexnum[p->id]--;
if(vexnum[p->id]==0)
{
queue[rear++]=p->id;
cout<<queue[rear-1]<<" ";
}
p=p->next;
}
}
cout<<endl;
return 1;
}
int main()
{
cin>>PNum;
for(int i=1;i<=PNum;i++){
Graph[i]=NULL;
visit[i]=0;
}
CreateGraph_Y();
Topologicalsort();
system("pause");
return 0;
}