拓扑排序模板
来源:互联网 发布:ubuntu 双系统 主分区 编辑:程序博客网 时间:2024/05/17 12:55
拓扑排序定义:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
拓扑排序的实现方法:
对于一个AOV网络进行拓扑排序的方法如下:
(1)从AOV网络中选择一个入度为0(即没有直接前驱)的顶点输出。
(2)从AOV网络中删除该顶点及该顶点发出的所有边。
(3)重复步骤(1)和(2),直至找不到入度为0的顶点。
以HDU - 1285为例:拓扑排序过程如下:
(1) 输出顶点1 (2) 输出顶点2
(3) 输出顶点3 (4) 输出顶点4
拓扑排序过程
最终排序结果:1 2 3 4
拓扑排序代码如下:
#include<stdio.h>#include<string.h>int n,m;int d[510]; //保存每个顶点入度int e[510][510];//邻接矩阵int a[510];//保存最终次序void tosort() //{ int i,j,k,num=0; //标记顶点 for(i=0; i<n; i++) { for(j=1; j<=n; j++) if(d[j]==0) { num=j; break; } d[num]=-1; a[i]=num; //保存顶点 for(k=1; k<=n; k++) if(e[num][k]==1) d[k]--; }}int main(){ while(~scanf("%d%d",&n,&m)) { int i,x,y; memset(e,0,sizeof(e)); memset(d,0,sizeof(d)); memset(a,0,sizeof(a)); for(i=1; i<=m; i++) { scanf("%d%d",&x,&y); if(!e[x][y]) { e[x][y]=1; d[y]++; //入度保存 } } tosort(); for(i=0; i<n-1; i++) printf("%d ",a[i]); printf("%d\n",a[n-1]); } return 0;}
- 拓扑排序的模板
- 拓扑排序及模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序-模板
- 拓扑排序toposort 模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序算法模板
- 拓扑排序【模板】
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 拓扑排序模板
- 在这场人工智能“战争”中,这些国家都在做些什么?
- 谷歌硬件战略缺陷:无法围绕谷歌助手打造硬件体系
- 2016全球教育机器人发展白皮书
- 谷歌花4亿英镑下注AI开始有回报 DeepMind创收了
- 路由器、交换机、集线器
- 拓扑排序模板
- CentOS 7更新时出现Multilib version problems
- 百度和高德地图接口取经纬度都有失效的时候,把两者结合起来用,才是解决之道。
- ASP.NET通过ajax调用后台方法
- gnuplot : 读取csv 文件, 画基金净值线
- Ping命令检测网站运行状态
- 认识java
- php常用算法
- 45.笔记go语言圣经——go语言变量