图论算法里的拓扑排序

Code

/**//*
2008-12-21 11:28:17 Accepted 1285 125MS 1040K 858 B
简单的拓扑排序
注意:输入可以是重复的边!!
*/
#include<iostream>
#define N 550

int out[N],top;//记录输出的数组(其实不需要)
int adjma[N][N];//邻接矩阵
int indeg[N];//把多有点的入度都记录下来
int used[N];//标记是否被使用过
int m,n;

void init()//初始化


{
int x,y;
memset(indeg,0,sizeof(indeg));
memset(used,-1,sizeof(used));
memset(adjma,0,sizeof(adjma));//由于输入会有重边,所以初始化一下
top=0;
for(int i=1;i<=m;i++)

{
scanf("%d%d",&x,&y);
if(!adjma[x][y])//对重边的判断

{
adjma[x][y]=1;
indeg[y]++;
}
}
}

void topsort()//拓扑排序的主例程


{
while(top<n)

{
int min=99999;
for(int j=1;j<=n;j++)
if(indeg[j]==0 && used[j]==-1)//找到所有入度为零,且未被使用(或是未知)的点中最小的点
min=min>j?j:min;
used[min]=1;//标记
out[top++]=min;//这句话改成直接输出应该也可以
for(int i=1;i<=n;i++)
if(adjma[min][i])
indeg[i]--;//对所有以min为起点,i为终点的i的入度减一
}
}

void output()//输出例程


{
for(int i=0;i<top;i++)

{
if(i)
putchar(' ');
printf("%d",out[i]);
}
putchar('\n');
}

int main()


{
while(scanf("%d%d",&n,&m)!=EOF)

{
init();
topsort();
output();
}
return 0;
}
posted @
2008-12-21 11:45
sunjian
阅读(
345)
评论()
收藏
举报