夏令营复习算法, 感到自己对之前学过的算法略有生疏, 写篇流水账, 权当复习.
- 并查集
- Dijkstra 算法
- Floyd 算法
- Kruskal 算法
并查集
处理连通关系的一种手段.
查询所属连通分支
1 | // fa[i] 表示i 所属的连通分支的代表元 |
合并操作
1 | void Union(int x, int y) |
Dijkstra 算法
单源最短路, 适用于权值非负的图.
实现代码
1 | // g 需要初始化, 下标从0 开始. |
HDU 2544: 最短路
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
大致思路
注意题目中下标从 1 开始.
AC代码
1 |
|
Floyd 算法
我所知道的唯一的全源最短路. 复杂度略高, 约 \(O(n^3)\). 可以视为动态规划. 简单好写.
实现代码
1 | // 初始化仍然是i == j时d[i][j]为0, 其余为inf. |
HDU 2544: 最短路
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
大致思路
还是这道裸题…除了注意题目中下标从 1 开始我都不知道还有什么可说的.
AC代码
1 |
|
Kruskal 算法
所有边排序, 逐条加边, 用并查集判连通, 求最小生成树.
实现代码
1 | // 并查集初始化为-1, 不需要在main函数里单独初始化 |
HDU 1863: 畅通工程
Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
Sample Output
3
?
大致思路
裸题, 没什么好说的, 一定要注意 tol
的初始化.
AC代码
1 |
|