中文题,不解释。
这是我的第一道拓扑排序题,先来讲一下什么是拓扑排序:
拓扑排序其实就是如果要进行某一项活动的时候,它的基础活动要先进行。比如说,学概率论之前必须要学会高等数学,那么高等数学就是学概率论的前提条件,这就牵涉到先后课程怎么学习,就是谁先学谁后学习, 拓扑排序就是解决这类问题的。
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1285
代码:
#include<stdio.h> #include<string.h> 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; }
hdoj 1085 确定比赛名次 【拓扑排序】,布布扣,bubuko.com
原文:http://blog.csdn.net/shengweisong/article/details/38408249