#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排序相关推荐

  1. 【算法数据结构体系篇class16】:图 拓扑排序

    一.图 1)由点的集合和边的集合构成 2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达 3)边上可能带有权值 二.图结构的表达 1)邻接表法 类似哈希表, key就是当前节点.value ...

  2. 数据结构C++——拓扑排序

    数据结构C++--拓扑排序 文章目录 数据结构C++--拓扑排序 一.前言 二.拓扑排序的概念及作用 三.拓扑排序的实现 ①拓扑排序的实现原理 ②拓扑排序中FindInDegree()函数的实现 ③拓 ...

  3. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  4. 【数据结构】拓扑排序

    如果一个有向图中没有包含简单的回路,这样的图为有向无环图. 图中的顶点代表事件(活动),图中的有向边说明了事件之间的先后关系.这种用顶点表示活动,用弧表示活动时间的优先关系的有向图称为顶点表示活动的网 ...

  5. LeetCode 802. 找到最终的安全状态(逆向图+拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走. 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止. 现在, 如果我们最后 ...

  6. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  7. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  8. 【数据结构(C语言)】数据结构-图

    图 文章目录 图 一.基本概念 1.图的定义 2.约定符号 3.分类 4.子图 5.路 6.其他术语 7.ADT 二.存储结构 1.邻接矩阵(数组) 2.邻接表 三.基本算法 1.遍历 2.求无向图的 ...

  9. topo排序判环实操

    项目场景: 有一张订单表,和订单关系表,订单关系表中维护订单与订单之间的父子关系(多对多). 现在需要根据目标订单id去查询到目标订单关系的完整链路与链路中订单信息集合,并且判断链路是否有成环现象. ...

最新文章

  1. C++开源库,欢迎补充。
  2. oracle 优化之批量处理bulk correct 和 forall
  3. shell预定义变量
  4. linux下ifconfig命令看不到IP centos7——ens33
  5. 认识 MySQL 和 Redis 的数据一致性问题
  6. SpringMVC+MyBatis+MySQL实现分页
  7. springMVC浏览器接受json报406错误的解决方法
  8. 第一篇:工作之我见一-----------细节决定成败(1)
  9. Atitit prgrmlan 编程语言主题列表 \0 it impttech topic\prgrmlan topic编程语言专题\AOP拦截器 表达式写法.docx \0 it impttec
  10. Xlim函数--Matplotlib
  11. Linux 中 ext、ext2、ext3、ext4 文件系统介绍与区别
  12. 电子政务网-网络架构
  13. oracle主键函数,oracle 主键+1 或 -1 的函数
  14. 网络安全应急响应-流量分析技术
  15. 怎样删除手机自带软件?
  16. Android实战 - 音心音乐播放器 (开启篇)
  17. Windows平台好用但小众软件推荐
  18. KEIL平台下新建华大HC32F460单片机工程笔记
  19. 如果你对未来还有点迷茫不妨来看一下,必看的软件测试指引!!!
  20. C语言设计流水灯程序,花式流水灯c语言程序.pdf

热门文章

  1. MVP模式基本用例开发
  2. 文字转语音合成器哪个好?这些文字转语音软件值得收藏
  3. python的文件操作:文件定位读写,重命名,删除等操作
  4. SpringBoot整合thymeleaf和Shiro项目绑定JS接口安全域名问题
  5. 【无标题语音聊天app源码——语音聊天派对】
  6. js控制元素左右缓慢移动和页面上下缓慢移动
  7. 谷歌日语输入法、中文输入法之间的切换
  8. Windows多用户配置,不同用户不同访问权限
  9. 上交计算机系专硕学费,上海交通大学2021级专硕学费再涨,最高翻3倍!@上海考研党...
  10. 安卓APP自动更新实现