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;
}
|