有向图的拓扑排序
2017-03-19 20:07
141 查看
拓扑排序的算法实现
描述:
首先找到入度为0的顶点,然后再将它的直接后继的所有顶点的入度数减1,然后输出该点,再找入度为0,如此循环,一直到找不到入度为0 的点。如果整个图的所有顶点都找到了,那么G中就没有有向环,而且输出的序列就是一个拓扑有序的序列。
但是由于可能存在同时两个点的入度都为0,所以拓扑序列不唯一。
描述:
首先找到入度为0的顶点,然后再将它的直接后继的所有顶点的入度数减1,然后输出该点,再找入度为0,如此循环,一直到找不到入度为0 的点。如果整个图的所有顶点都找到了,那么G中就没有有向环,而且输出的序列就是一个拓扑有序的序列。
但是由于可能存在同时两个点的入度都为0,所以拓扑序列不唯一。
#include <iostream> #include <cstdio> using namespace std; struct Edge{ int dest;//表示目标顶点 int value;//边的权值 Edge * link;//链表下一元素 }; void TopologicalSort(int n,Edge* edge ){ int degree ;//计算入度数,然后加到degree数组中 memset(degree, 0, n*sizeof(int)); Edge *l; for(int i=0;i<n;i++){ l=edge[i]; while(l){ degree[l->dest]++; l=l->link; } } //top表示入度为0 的顶点的栈的栈顶 int top=-1; for(int i=0;i<n;i++){ if(degree[i]==0){ degree[i]=top; top=i; } } for(int i=0;i<n;i++){ if(top==-1){ //表示没有入度为0的顶点 cout<<"存在有向环"<<endl; return; } else{ int j=top; top=degree[top]; cout<<j<<endl; l=edge[j]; while(l){ if(--degree[l->dest]==0){ //新的入度为0的点 degree[l->dest]=top; top = l->dest; } //下一个后继点 l=l->link; } } } } int main(){ int n;//顶点个数 cin>>n; Edge* edge ; int u,v; Edge *l; //初始化邻接表 for(int i=0;i<n;i++){ edge[i]=NULL; } while(cin>>u>>v){ l=new Edge; l->dest=v; l->link=edge[u]; edge[u]=l; } TopologicalSort(n, edge); return 0; }
相关文章推荐
- 确定比赛名次(拓扑排序)
- 【bzoj 2044】三维导弹拦截(拓扑排序+最小路径覆盖)
- hdu 2094 谁是冠军(STL,拓扑排序)
- 【数据结构与算法】拓扑排序
- [hdu1285]确定比赛名次(拓扑排序)
- UVa 10305 Ordering Tasks 拓扑排序
- 拓扑排序(字典序)
- 项链,蓝书P309Uva10054(拓扑排序,欧拉回路)
- 基于DFS的拓扑排序
- 【笔记】AOV网与拓扑排序
- 有向图----有向环检测和拓扑排序
- hdu5695 拓扑排序
- 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
- D. Robot Rapping Results Report(拓扑排序)
- 拓扑排序
- 【HDU 1811 Rank of Tetris】(拓扑排序判环 + 并查集合并)
- 拓扑排序AOV和AOE
- 拓扑排序
- 洛谷p1137 旅行计划 (拓扑排序)
- 利用拓扑排序判断是否有环(闭合回路)