給任務排序 Ordering Tasks UVA10305
阿新 • • 發佈:2020-07-26
題目描述
輸入格式
輸出格式
題目翻譯
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 namespacestd; 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; }