拓扑排序

引言:在现实生活中,事情的发生是与时间相关联的。存在着先干什么后干什么的顺序。干一件事情怎样做才可以节省时间?拓扑排序就是将复杂的一切有关联的事情按时间的顺序排好。在这里要特别注意的是拓扑排序是对于有向无环图来说的,若带有环路,环路上的事情则没有办法顺利进行。下面是一个拓扑排序的例子。
来源: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,如此重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值