题目:http://poj.org/problem?id=2367
题解:最基本的拓扑排序,没什么好说的,连是否存在环都不用判断
直接上代码吧:188k,0ms
//poj2367
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define M 105
int g[M][M];
int du[M],p[M];
bool useif[M];
int n,m;
void topo_sort()
{
int i,j,k,top=0;
/* for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) //寻找入度为0
{
if(du[j]==0)
{
k=j;
break;
}
}
du[k]=-1;
printf("%d ",k);
for(j=1;j<=n;j++) //入度减一
{
if(g[k][j])
{
du[j]--;
}
}
}*/
for(i=1;i<=n;i++)
{
if(du[i]==0)
{
useif[i]=true;
p[top++]=i;
}
}
while(top>0)
{
int x=p[--top];
printf("%d ",x);
for(i=1;i<=n;i++)
{
if(!useif[i] && g[x][i]==1)
{
du[i]--;
if(du[i] == 0)
{
useif[i]=true;
p[top++]=i;
}
}
}
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
memset(g,0,sizeof(g));
memset(du,0,sizeof(du));
for(i=1;i<=n;i++)
{
while(scanf("%d",&m)!=EOF&&m)
{
g[i][m]=1;
du[m]++;
}
}
topo_sort();
printf("\n");
}
return 0;
}