题解:大意是给出多组任务的优先顺序,然后输出所有任务的优先顺序,典型拓扑排序,是个有向无环图,深搜解决。
#include <stdio.h>
#include <string.h>
const int N = 100 + 5;
int n, m, g[N][N], topo[N], vis[N], t;
void init() {
memset(g, 0, sizeof(g));
memset(vis, 0, sizeof(vis));
memset(topo, 0, sizeof(topo));
}
bool dfs(int u) {
vis[u] = -1;//表示正在访问
for (int i = 1; i <= n; i++)
if (g[u][i]) {
if (vis[i] < 0)
return false;
else if (!vis[i] && !dfs(i))
return false;
}
vis[u] = 1;//表示已访问
topo[t--] = u;
return true;
}
bool toposort() {
t = n;
for (int i = 1; i <= n; i++)
if (!vis[i])
if (!dfs(i))
return false;
return true;
}
int main() {
int v1, v2;
while (scanf("%d%d", &n, &m) && (m || n)) {
init();
while (m--) {
scanf("%d%d", &v1, &v2);
g[v1][v2] = 1;
}
toposort();
for (int i = 1; i <= n - 1; i++)
printf("%d ", topo[i]);
printf("%d\n", topo[n]);
}
return 0;
}