拓扑排序

来源:互联网 发布:下载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
原创粉丝点击