拓扑排序

本文详细介绍了AOV网的拓扑排序算法,包括选取无前驱顶点、删除相关边、直至所有顶点输出的过程。若顶点无法全部输出,则说明存在回路。文章还提供了具体的算法实现代码,帮助读者深入理解拓扑排序的原理。

排序步骤:
1.从AOV网中选取一个没有前驱的顶点(该顶点入度为0),并输出它
2.从AOV网中删去该顶点及以它为弧尾的所有有向边
3.重复上述步骤直到剩余的网中不再存在没有前驱的顶点
结果:
一、AOV网中顶点未被全部输出,说明存在回路
二、反之,全部输出,说明不存在回路

算法

typedef stuct edge{
	int adjvex;         //该边终止顶点在顶点结点中的位置
	int weight;	      //该边权值
	struct edge *next;//指向下一个边结点
	}Elink;
typedef struct ver{
	int indegree ;//入度
	vertype vertex;//顶点信息
	Elink* link;//顶点结点类型定义
}OVLink;
voidTOPO_SORT(OVLink G[ ], int n, vertype V[]){
	Elink*p;
	int i,j,k,top=-1;
	 for(i=0;i<n;i++){               //堆栈初始化
		  if(G[i].indegree==0){//依次将入度为0的顶点压入堆栈
		  	G[i].indegree=top;
		  	top=i;
 		  }
	 }
	for(i=0;i<n;i++){
		if(top==-1){
		printf("\n存在回路");
		break;
		}
		else{
			j=top;         
			top=G[top],indegree;         //退出栈顶元素
			V[i]=G[j].vertex;               //输出一个顶点,V存放拓扑序列
			p=G[j].link;
			while(p!=NULL){                    //删除由该顶点引出的边
				k=p->adjvex;
				G[k].indegree--;//入度-1
				if(G[k].indegree==0){
					G[k].indegree=top;
					top=k;
				}
				p=p->next;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值