topological-sort(拓扑排序)
来源:互联网 发布:中文版木结构设计软件 编辑:程序博客网 时间:2024/05/17 08:22
在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
对一个有向无环图进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
算法
计算每个点的入度(有多少个点指向当前点)
入度为0的加入到拓扑序列中,并把它删除。删除后它指向的点的入度减1
重复上述过程,直到找不到入度为0的点或所有点到加入到了拓扑序列中
如果所有点加入到了拓扑序列中,拓扑排序完成
如果找不到入度为0的点,不存在拓扑序列
(注:图片来自博客 拓扑排序(Topological Sorting))
#include <stdio.h>#include <memory.h>#define MAXV 100int map[MAXV][MAXV];//存放边的信息int indegree[MAXV];//存放入度void topo_sort(int n){ int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(indegree[j]==0)//当前入度为0 { indegree[j]--; printf("%d ",j);//输出,既从图中去除 for(k=1;k<=n;k++) { if(map[j][k]==1) //它本来指向的顶点的入度减一 indegree[k]--; } break; } }}int main(){ int n,m; scanf("%d %d",&n,&m);//n为顶点数,m为边数 memset(map,0,sizeof(map)); memset(indegree,0,sizeof(indegree)); int i; int x,y; for(i=0;i<m;i++) { scanf("%d %d",&x,&y); if(!map[x][y]) { map[x][y]=1; indegree[y]++; } } topo_sort(n); return 0;}
阅读全文
0 0
- 拓扑排序(Topological Sort)
- 拓扑排序(Topological Sort)
- 拓扑排序(topological-sort)
- 拓扑排序(topological sort)
- 拓扑排序(topological sort)
- 拓扑排序(Topological Sort)
- topological-sort(拓扑排序)
- Topological Sort-拓扑排序
- 拓扑排序(Topological Sort)
- 拓扑排序 Topological-sort
- 拓扑排序 - Topological Sort
- Topological Sort拓扑排序
- 拓扑排序(topological sort)DFS
- DSOJ Topological Sort(拓扑排序)
- 拓扑排序学习(Topological Sort)
- 图论算法:拓扑排序(Topological Sort)
- pta ——Topological Sort(拓扑排序)
- 有关Topological-sort(拓扑排序)的belabela...
- href和src的区别
- spring-data-redis
- TabLayout和Viewpager配合使用
- iOS
- web渗透—xss之基于DOM漏洞
- topological-sort(拓扑排序)
- Spring Boot之分离测试和生产环境的应用配置
- oracle set指令
- Java:使用Java内置的HTTPServer类创建web服务
- Spring中的控制反转Ioc依赖注入DI的区别和联系
- python中字典keys,values,items的使用
- 数据结构基础概念篇
- 软件工程之设计模式
- 九九乘法表