【数据结构—图】拓扑Topo排序
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50typedef struct ArcNode{int adjvex;ArcNode *next;
};struct VNode{char value;ArcNode *first;
};struct AdGraph{VNode vertices[MaxSize];int vexnum,arcnum;
};//求图中每个顶点的入度
void getAllNodeDegree(AdGraph G,int *indegree){for(int i = 0;i < G.vexnum;i++){ArcNode *p = G.vexnum[i].first;while(p){indegree[p->adjvex]++;p = p->next;}}
}//算法思想:
/**首先,先用一个indegree数组把所有顶点的入度都初始化为0,再用一个函数(getAllNodeDegree())来得到整个图中所有顶点的入度。遍历整个数组,将入度为0的元素序列保存到栈中(stack[MaxSize]),当栈不为空的时候(top != -1),
将最后一个元素出栈,然后将其发到其他顶点的边也删除(这里的删除是逻辑删除,更改的是indegree[]),直到p走到空,(当p走到空的过程中,可能会有p->adjvex的顶点的入度被删完了,所以如果每一轮while(p){}循环里面都要设置if(indegree[p->adjvex] == 0;),来检测这一轮while循环删除里是否有元素的入度被删为0了,如果为0,就将此时的p->adjvex入栈。)然后再出栈下一个元素。ps:这里用count 来记录了toposequence里面元素的个数,当这个图是无环的,count == G.vexnum;
如果是有环的, count < G.vexnum,所以这里用bool 来判定这个图是否是有向无环图,就是直接看count是否等于G.vexnum.**//**
解释定义的数组:stack[MaxSize]:保存入度为0的数组indegree[MaxSize]:保存每个顶点入度的度数topoSequence[MaxSize]:保存拓扑排序 输出的数组**/
//Topo
//判断有向连通图是否有环
bool Topo(AdGraph G){int stack[MaxSize],top = -1;indegree[MaxSize],toposequence[MaxSize];for(int i = 0;i < G.vexnum;i++){indegree[i] = 0;}getAllNodeDegree(G,indegree);for(int i = 0;i < G.vexnum;i++){if(indegree[i] == 0){stack[++top] = i;}}int v;int count = 0;while(top != -1){v = stack[top--];toposequence[count++] = v;ArcNode *p = G.vertices[v].first;while(p){--indegree[p->adjvex];if(indegree[p->adjvex] == 0){stack[++top] = p->adjvex;}p = p->next;}}if(count == G.vexnum)return true;elsereturn false;
}//总结:
//采用邻接表存储时,Topo排序的时间复杂度是O(|v|+|e|)
// 邻接矩阵 , O(|V|^2).
//空间复杂度:O(|v|).//如果一个图按照三角矩阵存储,那么一定无环
【数据结构—图】拓扑Topo排序相关推荐
- 【算法数据结构体系篇class16】:图 拓扑排序
一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...
- 数据结构C++——拓扑排序
数据结构C++--拓扑排序 文章目录 数据结构C++--拓扑排序 一.前言 二.拓扑排序的概念及作用 三.拓扑排序的实现 ①拓扑排序的实现原理 ②拓扑排序中FindInDegree()函数的实现 ③拓 ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 【数据结构】拓扑排序
如果一个有向图中没有包含简单的回路,这样的图为有向无环图. 图中的顶点代表事件(活动),图中的有向边说明了事件之间的先后关系.这种用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动的网 ...
- LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)
文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...
- 数据结构--图(Graph)详解(四)
数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...
- 数据结构--图(Graph)详解(三)
数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...
- 【数据结构(C语言)】数据结构-图
图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...
- topo排序判环实操
项目场景: 有一张订单表,和订单关系表,订单关系表中维护订单与订单之间的父子关系(多对多). 现在需要根据目标订单id去查询到目标订单关系的完整链路与链路中订单信息集合,并且判断链路是否有成环现象. ...
最新文章
- C++开源库,欢迎补充。
- oracle 优化之批量处理bulk correct 和 forall
- shell预定义变量
- linux下ifconfig命令看不到IP centos7——ens33
- 认识 MySQL 和 Redis 的数据一致性问题
- SpringMVC+MyBatis+MySQL实现分页
- springMVC浏览器接受json报406错误的解决方法
- 第一篇:工作之我见一-----------细节决定成败(1)
- Atitit prgrmlan 编程语言主题列表 \0 it impttech topic\prgrmlan topic编程语言专题\AOP拦截器 表达式写法.docx \0 it impttec
- Xlim函数--Matplotlib
- Linux 中 ext、ext2、ext3、ext4 文件系统介绍与区别
- 电子政务网-网络架构
- oracle主键函数,oracle 主键+1 或 -1 的函数
- 网络安全应急响应-流量分析技术
- 怎样删除手机自带软件?
- Android实战 - 音心音乐播放器 (开启篇)
- Windows平台好用但小众软件推荐
- KEIL平台下新建华大HC32F460单片机工程笔记
- 如果你对未来还有点迷茫不妨来看一下,必看的软件测试指引!!!
- C语言设计流水灯程序,花式流水灯c语言程序.pdf