John有n个任务,但是有些任务需要在做完另外一些任务后才能做。
输入
输入有多组数据,每组数据第一行有两个整数1 <= n <= 100 和 m。n是任务个数(标记为1到n),m两个任务直接关系的数量。在此之后,有m行,每行有2个整数i和j,代表任务i必须在任务j之前完成。用n = m = 0结束整个输入。
输出
每一个数据对应一行n个整数,代表任务完成的顺序。
样例输入
5 4
1 2
2 3
1 3
1 5
0 0
样例输出
1 4 2 5 3
分析:这就是一道模板题吧,用dfs版本处理比较好输出.
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int maxn = 220; int n,ans[maxn],t,m,head[maxn],to[maxn],flag[maxn],nextt[maxn],tot = 1; void add(int x,int y) { to[tot] = y; nextt[tot] = head[x]; head[x] = tot++; } void dfs(int u) { flag[u] = 1; for (int i = head[u]; i; i = nextt[i]) { int v = to[i]; if (!flag[v]) dfs(v); } ans[t--] = u; } void solve() { memset(flag,0,sizeof(flag)); t = n; for (int i = 1; i <= n; i++) if (!flag[i]) dfs(i); } int main() { while (scanf("%d%d",&n,&m) == 2 && (n || m)) { tot = 1; memset(head,0,sizeof(head)); for (int i = 1; i <= m; i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); } solve(); for (int i = 1; i <= n; i++) { if (i != n) printf("%d ",ans[i]); else printf("%d",ans[i]); } printf(" "); } return 0; }