hdoj 1285 确定比赛名次 【拓扑排序】

中文题,不解释。

这是我的第一道拓扑排序题,先来讲一下什么是拓扑排序:

拓扑排序其实就是如果要进行某一项活动的时候,它的基础活动要先进行。比如说,学概率论之前必须要学会高等数学,那么高等数学就是学概率论的前提条件,这就牵涉到先后课程怎么学习,就是谁先学谁后学习, 拓扑排序就是解决这类问题的。

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1285

代码:

#include
#include
bool map[507][507];
int in[507];//模拟队列
int main()
{
	int n, m, a, b, i;
	while(scanf("%d%d", &n, &m) == 2){
		memset(map, 0, sizeof(map));
		memset(in, 0, sizeof(in));
		while(m --){
			scanf("%d%d", &a, &b);
			if(!map[a][b]){
				map[a][b] = 1;
				in[b]++;
			}
		}
		int top, t;
		for(i = n; i > 0; i --){ //这个不能从1开始,题目要求是输出顺序最小的序列
			if(!in[i]){
				top = i;
			}
		}
		t = 1;
		while(t < n){
			printf("%d ", top);
			in[top] --;
			t++;
			for(i = 1; i <= n; i ++){
				if(map[top][i]){
					in[i]--;
				}
			}
			for(i = n; i > 0; i --){//这里也是
				if(!in[i]){
					top = i;
				}
			}
		}
		printf("%d\n", top);
	}
	return 0;
}


你可能感兴趣的:(拓扑排序)