算法步骤:
1.从网中选取一个入度为0的顶点并且输出它
2.删除该顶点及其所有出边
3.重复1,2直到所有顶点已经输出,或者剩余顶点入度都不为0.说明网中存在回路无法继续进行拓扑排序。
代码:AOV网
void TopoOrder()
{
int n=graphsize;
int *count=new int[n];
//caculate the count
for (int i = 0;i < n;i++)
count[i] = 0;
// 记录各个结点的入度
for (int i = 0;i < n;i++)
{
Edge *p = Head[i].adjacent;
while (p!=NULL)
{
count[p->veradj]++;
p = p->link;
}
}
int top = -1;//初始化 栈顶指针
for (int i = 0;i < n;i++)
{
if (count[i] == 0)//如果入度为0 入栈
{
count[i] = top;
top = i;
}
}
for (int i = 0;i < n;i++)//AOV网中最多有n个顶点
{
//若循环体尚未被执行n次,栈顶指针已经为-1 说明有回路,终止程序
if (top == -1)
{
cout << "There is a cycle in network!" << endl;return;
}
else
{
int j = top;
top = count[top];//从栈中弹出一个顶点
cout << j << endl;//输出该顶点
Edge* p = Head[j].adjacent;//令p为j的边链表指针
while (p != NULL)
{
int k = p->veradj;
//k的入度减一,若入度为0,则k入栈
if (--count[k] == 0)
{
count[k] = top;
top = k;
p = p->link;
}
}
}
}
delete[]count;
}