算法与数据结构--拓扑排序

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。一个有向无环图的拓扑序列不是唯一的,进行拓扑排序的算法并不复杂:
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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章