拓扑排序
来源:互联网 发布:下载cad制图软件 编辑:程序博客网 时间:2024/05/23 15:54
引言:在现实生活中,事情的发生是与时间相关联的。存在着先干什么后干什么的顺序。干一件事情怎样做才可以节省时间?拓扑排序就是将复杂的一切有关联的事情按时间的顺序排好。在这里要特别注意的是拓扑排序是对于有向无环图来说的,若带有环路,环路上的事情则没有办法顺利进行。下面是一个拓扑排序的例子。
来源:http://dsalgo.openjudge.cn/201409week8/2/
拓扑排序
注意:总时间限制: 10000ms 内存限制: 65536kB
描述
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前
输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号
输出
若干个空格隔开的顶点构成的序列(用小写字母)
样例输入
6 81 21 31 43 23 54 56 46 5
样例输出
v1 v3 v2 v6 v4 v5
代码片:
#include<iostream>#include<vector>#include<list>#include<algorithm>#include<memory.h>using namespace std;vector<vector<int> >maps(110);int visited[100];void DFS(int peak,list<int>& a,int i,int n){if (n==0)return;list<int>::iterator it = find(a.begin(), a.end(),i);if (it==a.end()){cout << "v" << i <<" ";n--;unsigned int j = 0;while (j<maps[i].size()){list<int>::iterator s = find(a.begin(), a.end(), maps[i][j]);a.erase(s);j++;} visited[i] = 1; for (int c = 1; c < peak; c++) { if (visited[c] == 0) { i = c; break; } } i--;}i++;DFS(peak, a,i,n);}int main(){memset(visited, 0, sizeof(visited));int Peak_num, s;list<int>a;cin >> Peak_num >> s;for (int i = 0; i < s;i++){int s, t;cin >> s >> t;maps[s].push_back(t);a.push_back(t);}DFS(Peak_num,a,1,Peak_num);return 0;}
这个题目思路比较简单。跟平时做很多件事情一样,先是找到最开始要做的那件事,忙完后,接着做下一件,直到所有的事情都做完为止。拓扑排序也是一样的。找到开头,也就是入度为0的点,输出。删掉此顶点及其所有的出边,将入度减少1,如此重复。
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 虚函数
- ASIHttpRequest使用详解
- 最小生成树 Kruskal算法
- STL之Set自定义排序
- hdoj2052Picture
- 拓扑排序
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)
- Reorder List
- LK源码解析 2 main.c
- java系统参数
- App接口的设计
- windows系统下载安装Redmine
- 数据结构课后题目源码
- 有了这个列表,程序员不愁没练手的小项目了