经典拓扑排序入门题
先让入度0的顶点输出,然后将这些顶点所在的边剪掉,然后再让入度为0的顶点输出……直至所有顶点输出。此题注意有一个陷阱,m=0是可以的,就相当于任何一个都可以直接输出。
此题还有一点就是它的输出顺序,先把所有入度为0 的顶点按序号从小到大输出,然后再去剪掉边,所以就加了flag0数组来存放这些顶点
#include <stdio.h>
#include <string.h>
struct _tag
{
int intil,last;
}v[10000];
int flag[101],flag0[101];
int main(int argc, char const *argv[])
{
int n,m,i,k,j,fl0;
while(scanf("%d %d",&n,&m)==2&&(n||m))//m=0是可以的
{
k=0;
memset(flag,0,101*sizeof(int));
for(i=1;i<=m;i++)
{scanf("%d %d",&v[i].intil,&v[i].last);
flag[v[i].last]++;
}
while(k<n)
{
fl0=0;
for(i=1;i<=n;i++)
if(!flag[i]) flag0[fl0++]=i;
for(i=0;i<fl0;i++)
{printf("%d%c",flag0[i],k==n-1?'\n':' ' );
for(j=1;j<=m;j++)
if(v[j].intil==flag0[i]) flag[v[j].last]--;
flag[flag0[i]]--;
k++;}
}
}
return 0;
}