这道题做的自己心烦意乱!
本来想找一种快一些的方法。。结果把自己搞的晕头转向。。。
自己一直坑的一个地方。用邻接表的话其实不用考虑重边,因为你在删点的时候一定会删掉重边,并不用担心。我是每次找到一个入度为0的点的时候进行更新后却没有break,还是继续循环,这样结果就会出错,可能在这个循环中有两个入度为0的点,但是我可能更新后也出现了入度为0得点,然后答案的顺序就错了。。。
#include <stdio.h>
#include <string.h>
#define maxn 510
int map[maxn][maxn],in[maxn];
int n,m;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
memset(in,0,sizeof(in));
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
if(!map[x][y])
{
map[x][y]=1;
in[y]++;
}
}
for(int i=0;i<n;i++)
{
for(int j=1;j<=n;j++)
{
if(in[j]==0)
{
in[j]=-1;
if(i!=0) printf(" ");
printf("%d",j);
for(int k=1;k<=n;k++)
if(map[j][k]) in[k]--;
break;
}
}
}
printf("\n");
}
return 0;
}