对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。
头文件:TopoLogicalSort.h
#ifndef TOPLOGICALSORT_H
#define TOPLOGICALSORT_H
#define MAXVEX 20 //最大顶点数
typedef int VertexType; //顶点的数据类型
typedef struct edgenode{
int AdjVex; //当前顶点的下标
int weight; //用于存储权值
struct edgenode *next;
}EdgeNode;
typedef struct vertexnode{
VertexType data;
int in; //入度
EdgeNode *FirstEdge;
}VertexNode;
typedef struct graph{
VertexNode Vertex[MAXVEX]; //图的顶点数组
int NumVertex,NumEdge; //图的顶点数和边数
}Graph;
void CreateGraph(Graph *G); //创建图的连接
void TopoLogicalSort(Graph *G); //拓扑排序算法
#endif //TOPLOGICALSORT_H
实现文件:TopoLogicalSort.cpp
#include "TopoLogicalSort.h"
#include <stdlib.h>
#include <stdio.h>
void CreateGraph(Graph *G)
{
EdgeNode *e = NULL;
G->NumVertex = 9;
G->NumEdge = 12;
for(int i = 0;i < G->NumVertex;++i)
{
G->Vertex[i].data = i;
G->Vertex[i].in = 0;
G->Vertex[i].FirstEdge = NULL;
}
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[0].FirstEdge;
e->AdjVex = 4;
G->Vertex[0].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[0].FirstEdge;
e->AdjVex = 5;
G->Vertex[0].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[1].FirstEdge;
e->AdjVex = 2;
G->Vertex[1].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[1].FirstEdge;
e->AdjVex = 4;
G->Vertex[1].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[1].FirstEdge;
e->AdjVex = 8;
G->Vertex[1].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[2].FirstEdge;
e->AdjVex = 5;
G->Vertex[2].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[2].FirstEdge;
e->AdjVex = 6;
G->Vertex[2].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[3].FirstEdge;
e->AdjVex = 2;
G->Vertex[3].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[4].FirstEdge;
e->AdjVex = 7;
G->Vertex[4].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[5].FirstEdge;
e->AdjVex = 8;
G->Vertex[5].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[6].FirstEdge;
e->AdjVex = 5;
G->Vertex[6].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->next = G->Vertex[8].FirstEdge;
e->AdjVex = 7;
G->Vertex[8].FirstEdge = e;
++G->Vertex[e->AdjVex].in;
}
void TopoLogicalSort(Graph *G)
{
EdgeNode *e;
int i,gettop;
int top = 0; //用于栈指针下标
int count = 0; //用于统计输出的顶点数
int Stack[MAXVEX]; //建栈存储入度为0的顶点
for(i = 0;i < G->NumVertex;++i)
{
if(!G->Vertex[i].in) //把所有入度为0的顶点压栈
Stack[++top] = i;
}
while(top != 0)
{
gettop = Stack[top--];
count++;
printf("%d ",G->Vertex[gettop].data);
for(e = G->Vertex[gettop].FirstEdge;e;e = e->next)
{
if(!(--G->Vertex[e->AdjVex].in))
Stack[++top] = e->AdjVex;
}
}
}
实现文件:main.cpp
#include "TopoLogicalSort.h"
int main()
{
Graph G;
CreateGraph(&G);
TopoLogicalSort(&G);
return 0;
}