1. 程式人生 > 實用技巧 >給任務排序 Ordering Tasks UVA10305

給任務排序 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; }