算法與數據結構--拓撲排序

對一個有向無環圖(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;
}


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