图的拓扑排序C/C++代码实现

本文介绍了如何使用C/C++实现图的拓扑排序,详细讲解了拓扑排序的概念及其在有向无环图(DAG)中的应用。通过具体的步骤描述了算法流程,并提供了代码示例及运行结果。
摘要由CSDN通过智能技术生成

AOV-网:

一个无环的有向图称作有向无环图(Directed Acycline Graph), 简称DAG图

用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertex Netwrok) ,简称AOV-网

拓扑排序:

所谓拓扑排序就是将AOV-网中所有顶点排成一个线性序列。

作用:可用来判断图或网中是否有环。检测的办法是对有向图的顶点进行拓扑排序,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网中必定不存在环,否则有环。
除了用拓扑排序判断图有无环外,深度优先遍历同样也能判断。

具体步骤:

(1) 在有向图中选一个无前驱的顶点且输出它。
(2) 从图中删除该顶点和所有以它为尾的弧(代码可用弧头顶点的入度减1的办法来实现)。
(3) 重复 (1) 和 (2), 直至不存在无前驱的顶点。
(4) 若此时输出的顶点数小千有向图中的顶点数,则说明有向图中存在环,否则输出的顶点序列即为一个拓扑序列。

以该图为例:
在这里插入图片描述

代码如下:

#include<stdio.h>

#define MVNum 100
typedef char OtherInfo;
typedef char VerTexType;

//图的邻接表存储结构
typedef struct ArcNode			//边结点
{
   
	int adjvex;	//邻接点域 
	struct ArcNode *nextarc;//链域
	OtherInfo info;	//数据域 
}ArcNode;
typedef struct VNode			//顶点信息
{
   
	VerTexType data;//数据域 
	ArcNode *firstarc;//链域
}VNode, AdjList[MVNum];
typedef struct                  //邻接表
{
   
	AdjList vertices;
	int vexnum, arcnum;
}ALGraph;

//函数声明
int LocateVex(ALGraph G, char v);
void LinkAL(ALGraph &G, int i, int j);
void FindInDegree(ALGraph G, int indegree[]);
void printTopo(int topo[], int m);


//邻接表创建有向图
void CreateUDG(ALGraph &G)
{
   
	G.vexnum = 6;						//输入总顶点数和边数
	G.arcnum = 8;
	G.vertices[0].data = 'v1';			//输入顶点信息
	G.vertices[0].firstarc = NULL;
	G.vertices[1].data = 'v2';
	G.vertices[1].firstarc = NULL;
	G.vertices[2].data = 'v3';
	G.vertices[2].firstarc = NULL;
	G.vertices[3].data = 'v4';
	G.vertices[3].firstarc = NULL;
	G.vertices[4].data = 'v5';
	G.vertices[
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值