#include<stdio.h>
#include<string.h>
int in[1000],match[1000][1000];//in[]存储点的入度 ,match[]存储图的临界阵
int main()
{
int m,n,i,j,p,q,k;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(match,0,sizeof(match));
memset(in,0,sizeof(in));
for(i=1;i<=m;i++)
{
scanf("%d%d",&p,&q);
if(match[p][q]==0)//此处别忘了重边的判断,否则会wa
{
match[p][q]=1;
in[q]++;//重边的时候,如果不做处理,度数为计算错误
}
}
//拓扑排序
for(i=1;i<=n;i++)//进行n次遍历,每次找出一个入度为0的节点
for(j=1;j<=n;j++)//遍历所有节点
if(in[j]==0)//找出入度为0的节点
{
in[j]--; //度数递减,避免下次继续找到
if(i!=n)
{
printf("%d ",j);
}
else printf("%d\n",j);
for(k=1;k<=n;k++)
{
if(match[j][k]==1)// 删除与度数为0的节点相关联的边
in[k]--;
}break;
}
}
return 0;
}
模板点击打开链接