拓扑排序算法

 

对一个有向无环图(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;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值