给任务排序 Ordering Tasks UVA10305
Posted stu-jyj3621
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给任务排序 Ordering Tasks UVA10305相关的知识,希望对你有一定的参考价值。
题目描述
输入格式
输出格式
题目翻译
John有n个任务要做,每个任务在做之前要先做特定的一些任务。
输入第一行包含两个整数n和m,其中1<=n<=100。 n表示任务数,而m表示有m条任务之间的关系。 接下来有m行,每行包含两个整数i和j,表示任务i要在j之前做。
当读入两个0(i=0,j=0)时,输入结束。
输出包含q行,每行输出一条可行的安排方案。
【输入样例】
5 4 1 2 2 3 1 3 1 5 0 0
【输入样例】
1 4 2 5 3
#include <iostream> #include <cstring> using namespace std; const int maxn = 100 + 20; bool G[maxn][maxn]; int c[maxn], topo[maxn]; int n, m, t; bool dfs(int u) { c[u] = -1; for (int v = 1; v <= n; v++) { if (G[u][v]) { if (c[v] < 0) return false; if (!c[v] && !dfs(v)) return false; } } c[u] = 1; topo[t--] = u; return true; } bool topoSort() { t = n; memset(c, 0, sizeof(c)); for (int u = 1; u <= n; u++) { if (!c[u]) { if (!dfs(u)) { return false; } } } return true; } int main() { while (cin >> n >> m && n) { memset(G, false, sizeof(G)); for (int u = 0; u < m; u++) { int a, b; cin >> a >> b; G[a][b] = true; } topoSort(); for (int u = 1; u <= n; u++) { if (u == 1) { cout << topo[u]; } else { cout << " " << topo[u]; } } cout << endl; } return 0; }
以上是关于给任务排序 Ordering Tasks UVA10305的主要内容,如果未能解决你的问题,请参考以下文章
[拓扑排序]Ordering Tasks UVA - 10305