拓扑排序的想法十分简单:找个访问的且入读为0的节点访问,然后标记该节点为访问,删除该节点,更新图中其他节点的入度,接着重复上述过程。
思路简单,程序也很好写,复杂度O(N^2)
/*
* 拓扑排序 [HDU-1285]
* mike-w
* 2012-10-23
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 555
int f[MAXN][MAXN];
int in[MAXN];
int tag[MAXN];
int N, M;
int main(void)
{
int i, j, t1, t2, head;
while(scanf("%d%d", &N, &M)!=EOF)
{
memset(f, 0, sizeof(f));
memset(in, 0, sizeof(in));
memset(tag, 0, sizeof(tag));
for(i=0; i<M; i++)
{
scanf("%d%d", &t1, &t2);
f[t1][++f[t1][0]]=t2;
in[t2]++;
}
for(i=0; i<N; i++)
{
for(j=1; j<=N; j++)
if(!in[j] && !tag[j])
break;
head=j;
printf("%d%c", head, i==N-1?'\n':' ');
tag[head]=1;
for(j=1; j<=f[head][0]; j++)
in[f[head][j]]--;
}
}
return 0;
}