图的拓补排序基本算法
2016-04-09 21:19
190 查看
拓补排序很简单,就是一个图中存在(u, v)使得u必须在v之前遍历,而算法所要做的就是按照拓补顺序将图遍历。举例子,就像大学课程,某课程a是课程b的先修课程,即必须先学完a才能学b课程,而用拓补算法能够合理给出一个课程安排顺序。注意图中不能存在环,否则拓补排序将失败。基本算法如下:
#include <iostream> #include <cstdio> #include <vector> #include <queue> #include <cstring> using namespace std; const int maxn = 100 + 5; int n, m; int G[maxn][maxn], inDgree[maxn]; vector<int> ans; bool topoSort() { queue<int> q; int cnt = 0; for(int i = 0; i < n; i++) if(inDgree[i] == 0) q.push(i); //将所有节点为0的点压入队列 while(!q.empty()) { int u = q.front(); q.pop(); ans.push_back(u); cnt++; for(int i = 0; i < n; i++) if(G[u][i]) { G[u][i] = 0; if(--inDgree[i] == 0) q.push(i); } } if(cnt != n) return false; else return true; } int main() { //freopen("input.txt", "r", stdin); cin >> n >>m; memset(G, 0, sizeof(G)); memset(inDgree, 0, sizeof(inDgree)); int u, v; for(int i = 0; i < m; i++) { cin >> u >> v; G[u][v] = 1; inDgree[v]++; } ans.clear(); if(topoSort()) { printf("%d", ans[0]); for(int i = 1; i < ans.size(); i++) printf("-->%d", ans[i]); printf("\n"); } else printf("Error ! there is a circle in the graph!!"); return 0; }
相关文章推荐
- Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
- log4j.properties 详解与配置步骤
- uva 202 Repeating Decimals
- uva 10340 All in All
- 关于apache上的CGI文件问题总结--为什么无法找到cgi文件、为什么找到了cgi文件却不执行反而询问是否下载或直接显示文件代码
- java中的回调函数理解
- linux下查找某个文件位置的方法
- Android MotionEvent 和 TouchSlop
- 2016.04.09 使用Powerdesigner进行创建数据库的概念模型并转为物理模型
- win10安装提示组件存储损坏的解决探讨(附DISM命令的简单使用)
- c语言编写求解数独
- 【剑指 offer】(二十二)—— 栈的压入、弹出序列
- 古老编程环境展——LFS Linux篇
- 三言两语说shader(七)黑幕扩散
- 解决android EditText自动获取焦点的问题
- uva 1587 Box
- HDU 4715 Difference Between Primes (筛法求素数)
- xshell利用linux rz sz 命令上传、下载文件
- java基础知识
- 京东2016春招(实习)笔试+编程题