简单的topsort,不解释!
可用队列做,也可用for遍历!
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
using namespace std;
int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N 1000010
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)
int g[110][110];
int in[110];
int n,cnt;
int ans[110];
void topsort(){
int i,j,k;
cnt=0;
/*
for(i=1;i<=n;i++){//遍历n次
for(j=1;j<=n;j++)
if(in[j]==0)
{ans[cnt++]=j;in[j]=-1;break;}
for(k=1;k<=n;k++)
if(g[j][k])
in[k]--;
}*/
queue<int> q;
for(i=1;i<=n;i++)
if(in[i]==0){
q.push(i);
in[i]=-1;
break;
}
while(!q.empty()){
int x=q.front();
q.pop();
ans[cnt++]=x;
for(i=1;i<=n;i++){
if(g[x][i])
in[i]--;
if(in[i]==0)
{
in[i]=-1;
q.push(i);
}
}
}
}
int main(){
int i,j,k;
while(scanf("%d",&n)!=EOF){
memset(in,0,sizeof(in));
memset(g,0,sizeof(g));
for(i=1; i<=n; i++){
int a;
while(scanf("%d",&a)&&a){
g[i][a]=1;
in[a]++;
}
}
topsort();
printf("%d",ans[0]);
for(i=1;i<cnt;i++)
printf(" %d",ans[i]);
puts("");
}
return 0;
}