引言:在现实生活中,事情的发生是与时间相关联的。存在着先干什么后干什么的顺序。干一件事情怎样做才可以节省时间?拓扑排序就是将复杂的一切有关联的事情按时间的顺序排好。在这里要特别注意的是拓扑排序是对于有向无环图来说的,若带有环路,环路上的事情则没有办法顺利进行。下面是一个拓扑排序的例子。
来源:http://dsalgo.openjudge.cn/201409week8/2/
拓扑排序
注意:总时间限制: 10000ms 内存限制: 65536kB
描述
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前
输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号
输出
若干个空格隔开的顶点构成的序列(用小写字母)
样例输入
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 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,如此重复。