拓扑排序
来源:互联网 发布:放逐之城4.5数据 编辑:程序博客网 时间:2024/06/06 14:12
原文地址:点击打开链接
拓扑排序就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。
拓扑排序的一个用途就是判断一个有向图是否有环。
性质
1、拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。
2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路
3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序
拓扑排序还有一个重要的功能就是判断节点是一条链,还是在某个节点出现了分叉。
拓扑排序的链式前向星实现:
- #include <iostream>
- #include <string.h>
- #include <stdio.h>
- using namespace std;
- const int N = 10005;
- bool vis[N];
- int head[N],degree[N];
- int Q[N],cnt,num;
- struct EdgeNode
- {
- int to;
- int next;
- };
- EdgeNode Edge[N];
- void Init()
- {
- cnt = 0;
- memset(vis,false,sizeof(vis));
- memset(head,-1,sizeof(head));
- memset(degree,0,sizeof(degree));
- }
- void add(int u,int v)
- {
- degree[v]++;
- Edge[cnt].to = v;
- Edge[cnt].next = head[u];
- head[u] = cnt++;
- }
- void TopSort(int n)
- {
- num = 0;
- for(int i=1;i<=n;i++) //先将没有前驱的节点加入队列
- if(!degree[i]&&vis[i])
- Q[num++] = i;
- for(int i=0;i<num;i++)
- {
- //删除从该节点出发的所有边,更新degree数组
- for(int k = head[Q[i]];k != -1;k = Edge[k].next)
- {
- degree[Edge[k].to]--;
- //如果degree数组为0,说明新的没有前驱的节点找到,加入队列中
- if(!degree[Edge[k].to])
- Q[num++] = Edge[k].to;
- }
- }
- }
- int main()
- {
- int n,m;
- while(cin>>n>>m)
- {
- Init();
- while(m--)
- {
- int x,y;
- cin>>x>>y;
- vis[x] = true;
- vis[y] = true;
- add(x,y);
- }
- TopSort(n);
- for(int i=0;i<num;i++)
- cout<<Q[i]<<" ";
- cout<<endl;
- }
- return 0;
- }
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- js简单运动框架--2 多属性运动
- AFNetwork 作用和用法详解
- Scala学习笔记(一) 基础类型
- MyBatis批量增删改
- T60/T60p显卡的官方Windows 7驱动下载网址
- 拓扑排序
- STL容器list
- 阅读笔记2
- Android瀑布流StaggeredGridView学习研究
- IT女娃开博啦。。
- SQL中Null需要注意的地方
- 逐行读txt文件(读写文件try catch finally 处理空行,编码格式,文件流释放问题,处理读到重复问题)
- HDOJ-5446/2015 ACM/ICPC Asia Regional Changchun Online 1010(数论)
- UML——活动图