今晚get项新技能,拓扑排序,拿例题说吧
在这里,我们可以画一张图这里,1指向2,1的入度为0,2的入度为1,而同理,3有2,4同时指向,而4没有,所以4的入度为0,而3的入度为2,这里,我们可以将图存入一个数组里,然后,我们将入度为0的点按大小输出,然后将他连的点的入度减1,即将地图上和他有关的路径撤去。
然后,原谅我语文的垃圾,直接贴代码吧。
#include<stdio.h>
#include<string.h>
int a[505];
int in[505];
int b[505];
bool maps[505][505];
int main()
{
int i,j,m,n,k,l;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(maps,0,sizeof(maps));
memset(in,0,sizeof(in));
for(i=1;i<=m;i++)
{
scanf("%d %d",&k,&l);
if(maps[k][l]==false)//判断是否重复
{
maps[k][l]=true;
in[l]++;
}
}
int count=0;
while(count<n)
{
for(i=1;i<=n;i++)
{
if(in[i]==0)//入度为0的点
{
b[count]=i;
in[i]=-1;//消除该点
count++;
break;
}
}
for(j=1;j<=n;j++)
{
if(maps[i][j]==true)
in[j]--;//与之相连的入度减1
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",b[i]);
}
printf("%d\n",b[n-1]);
}
return 0;
}
注意,这个图千万不能是环形图,只能是单向,不然,就会陷入死循环