拓扑排序的一道裸题。
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 100 + 10;
int n, a[maxn][maxn], tp[maxn], t, vis[maxn];
void init(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
int j = 1;
while(scanf("%d", &a[i][j]) && a[i][j]) j++;
a[i][0] = j-1;
}
}
void dfs(int now){
for(int i = 1; i <= a[now][0]; i++)
if(!vis[a[now][i]])dfs(a[now][i]);
tp[--t] = now;
vis[now] = 1;
}
void toposort(){
t = n + 1;
for(int i = 1; i <= n; i++)
if(!vis[i]) dfs(i);
for(int i = 1; i <= n; i++)
printf("%d ", tp[i]);
puts("");
}
int main(){
init();
toposort();
return 0;
}