您的位置:首页 > 其它

[HDU-1285] 拓扑排序

2012-10-23 21:38 162 查看
拓扑排序的想法十分简单:找个访问的且入读为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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: