对一个
有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,
若<u,v> ∈E(G),则u在线性序列中出现在v之前。一个有向无环图的拓扑序列不是唯一的,进行拓扑排序的算法并不复杂:
1)在有向图中选一个没有前驱(入度为0)的顶点且输出之。
2)从图中删除该顶点及它发出的弧(这样就得到了别的入度为0的顶点)。
重复上述2步,直到输出全部顶点。
1)在有向图中选一个没有前驱(入度为0)的顶点且输出之。
2)从图中删除该顶点及它发出的弧(这样就得到了别的入度为0的顶点)。
重复上述2步,直到输出全部顶点。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NODESIZE 100 //最大顶点数
using namespace std;
struct node{
int v; //顶点序号
struct node *next;//邻接的下一顶点
int size;//该顶点入度数
int isUnSort;//是否已排过序
}
vNode[NODESIZE],//顶点源 做邻接表使用
result[NODESIZE];//排序结果
//初始化顶点信息
void initNodes(int nodeSize){
for(int i=0;i<nodeSize;i++){
vNode[i].v=i;
vNode[i].size=0;
vNode[i].next=NULL;
vNode[i].isUnSort=1;
}
}
//创建一个新的顶点
struct node *createNode(int v){
struct node *newNode;
newNode=(struct node *)malloc(sizeof(struct node));
newNode->next=NULL;
newNode->v=v;
return newNode;
}
//重头戏 拓扑排序
void topoSort(int nodeSize){
struct node *p;
for(int i=0;i<nodeSize;i++)
for(int j=0;j<nodeSize;j++)
if(vNode[j].isUnSort && vNode[j].size==0){
vNode[j].isUnSort=0;
result[i]=vNode[j];
p=&vNode[j];
while(p->next!=NULL){
p=p->next;
vNode[p->v].size--;
}
break;
}
}
int main()
{
int i,from,to,nodeSize,edgeSize;
struct node *p;
//输入顶点数与边数
cin>>nodeSize>>edgeSize;
initNodes(nodeSize);
//边关系 从顶点from指向顶点to
for(i=0;i<edgeSize;i++){
cin>>from>>to;
p=&vNode[from];
while(p->next!=NULL)
p=p->next;
p->next=createNode(to);
//被指向顶点的入度增加
vNode[to].size++;
}
topoSort(nodeSize);
for(i=0;i<nodeSize;i++)
cout<<result[i].v<<endl;
return 0;
}