按入度为0的序列排序,找到一个删除一个
#include<stdio.h>
#include<string.h>
#define MAXN 1000
int in[MAXN];//记录入度数
int p[MAXN][MAXN];//记录两点是否相连
int n,m;//m为边数,n为节点数 (1~n)
void toposort()
{
for(int i=1 ; i<=n ; i++)//n个点,一次删除一个,所以要遍历n次
{
for(int j=1 ; j<=n ; j++)
{
if(in[j]==0)
{
in[j]=-1;//入度为-1,标记为已被删除
printf("%d",j);
if(i!=n) printf(" ");
else printf("\n");
for(int k=1 ; k<=n ; k++)
{
if(p[j][k])
{
in[k]--;
}
}
break;//找到了就跳出,然后遍历找下一个
}
}
}
}
int main()
{
int x,y;
while(~scanf("%d %d",&n ,&m ))
{
memset(in,0,sizeof(in));
memset(p,0,sizeof(p));
for(int i=0 ; i<m ; i++)
{
scanf("%d %d",&x,&y);
if(!p[x][y])//杜绝重复输入对入度数带来的影响
{
p[x][y]=1;
in[y]+=1;
}
}
toposort();
}
return 0;
}