数据结构之图的应用:拓扑排序

思维导图:

在这里插入图片描述

拓扑排序的定义:

在这里插入图片描述在这里插入图片描述

拓扑排序的算法思想:

在这里插入图片描述

在这里插入图片描述
ps: 拓扑排序不一定唯一

拓扑排序的代码实现:

在这里插入图片描述

bool ToplogicalSort(Graph G){
	InitStack(s);				//当出现多个入队为0的顶点时入栈保存 
	for(int i=0;i<G>vexnum;i++)
		if(indegree[i] == 0)	//保存所有顶点当前的入度 
			push(S,i);
	int count = 0;				//当前访问的顶点的个数 
	while(!isEmpty(s)){			//不为空 
		Pop(s,i);
		print[count++] = i;		//保存拓扑序列大的数组 
		for(p = G.Vertices[i].firstarc;p;p = nextarc){		//遍历边表 
			v = p->adjvex;
			if(!(--indegree[v]))	//删除一个顶点后让其相邻顶点入度减一,若减一之后为0,则入栈 
				Push(s,v);
		}
	} 
	if(count < G>vexnum)			//是否访问了全部节点 
		return false;
	else
		return true;
} 
//时间复杂度:O(|V|+|E|)

拓扑排序的特点:

在这里插入图片描述

逆拓扑排序:

在这里插入图片描述
PS:
用邻接矩阵优于邻接表

用DFS算法实现逆拓扑排序:

bool visited[MAX_TRUE_SIZE];
void DFSTraverse(Graph G){
	for(int i=0;i<G.vexnum;++i)
		visited[i] = false;
	for(int i=0;i<G.vexnum;++i)
		if(!visited[i])
			DFS(G,i);
}

void DFS(Graph G,int v){
	visit(v);
	visited[v] = true;
	for(w = FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
		if(!visited[w])
			DFS(G,w);
	print(v);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值