算法竞赛入门经典 例题6-15

UVa10305

Ordering Tasks

按照任务的依赖关系,对任务进行拓扑排序。

其实我已经忘了该怎么写了,但是大概可以猜一下:首先找到不依赖任何其他任务的任务,然后所有依赖于此任务的任务便有了可以完成的前提条件,如此循环即可。

这道题只需要找到解,并不要求解的结构,因此uDebug上的很多测试用例不太方便验证对错。

#include <iostream>
#include <list>
#include <vector>

using namespace std;

int main()
{
	size_t n, m;
	while (1) {
		cin >> n >> m;
		if (n == 0 && m == 0) break;
		vector<list<size_t>> relations(n);
		vector<size_t> order;
		vector<bool> done(n, false);
		for (size_t k = 0; k < m; k++)
		{
			size_t i, j;
			cin >> i >> j;
			relations[j - 1].push_back(i - 1);
		}
		while (1) {
			for (size_t i = 0; i < relations.size(); i++)
			{
				if (!done[i] && relations[i].empty()) {
					order.push_back(i);
					done[i] = true;
					for (size_t j = 0; j < relations.size(); j++)
					{
						relations[j].remove(i);
					}
					break;
				}
			}
			if (order.size() == n) break;
		}
		for (size_t no : order)
		{
			cout << no + 1 << ' ';
		}
		cout << endl;
	}
	return 0;
}
/*
5 4
1 2
2 3
1 3
1 5
0 0
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值