赤果果的拓扑排序,水之~
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stack>
#include<queue>
#include<math.h>
#include<cstdio>
using namespace std;
int map[110][110];
int in_degree[110];
int ans[110];
int top_sort(int n)
{
int tmp=1;
queue<int> q;
memset(in_degree,0,sizeof(in_degree));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j])
in_degree[j]++;
for(int i=1;i<=n;i++)
if(!in_degree[i])
q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
ans[tmp++]=u;
for(int i=1;i<=n;i++)
{
if(map[u][i])
{
map[u][i]=0;
in_degree[i]--;
if(in_degree[i]==0)
q.push(i);
}
}
}
return tmp;
}
int main()
{
int n,m,v;
while(~scanf("%d",&n))
{
memset(map,0,sizeof(map));
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++)
{
while(1)
{
scanf("%d",&v);
if(v==0) break;
map[i][v]=1;
}
}
int t=top_sort(n);
for(int i=1;i<t;i++)
cout<<ans[i]<<(i==(t-1)?'\n':' ');
}
return 0;
}