目录
Description
给出一个数字N,代表有N个点,然后给出这N个点的坐标。 求一个最小生成树将这N个点连通起来。 这里两点间的距离为欧几里德距离,即两点的横坐标相差的平方与纵坐标相差的平方加起来,再开根号
多组数据,请注意清空
Format
Input
整个测试有多组数据
对于每组数据
第一行给出数字N,N<=1000
接下来N行给点的坐标x,y.-10000 <= X,Y <= 10000
整个测试以0代表结束
Output
针对每个数据输出一行,代表结果
Samples
输入数据 1
5
0 0
0 1
1 1
1 0
0.5 0.5
0
输出数据 1
2.83
输入数据 2
3
1 1
2 3
4 5
4
1 1
3 3
6 6
9 9
0
输出数据 2
5.06
11.31
分析
看看标题。
最小生成树是什么?
最小生成树是在一个给定的无向图中求一棵树, 使得这棵树拥有图中的所有顶点,且所有边都是来自图中的边,并且满足整棵树的边权之和最小。
摘自Deosiree的博客
看到这么小的数据,那么用就可以过了,那么接下来就开始prim算法的讲解。
假如我们有下面这个图
当然咯,这并不是原题中的图(原题中是完全图),不过做法是一样的。
首先,我们设这个最小生成树的根为1,最开始,最小生成树(以后简称为mst)中有且只有一个点:1。
接下来,我们再设f[i]表示i点到mst的最短距离,即将它与mst中的点连接的边中最短的一条的长度,f[1]=0,其它初值为无限大,
设bool check[i]表示i是否在mst中,设way[i][j]表示i与j之间的距离,且way[i][j]==way[j][i]
所以我们有:
1 | 2 | 3 | 4 | 5 | 6 | 7 | |
1 | 0 | 23 | 0 | 0 | 0 | 28 | 36 |
2 | 23 | 0 | 20 | 0 | 0 | 0 | 1 |
3 | 0 | 20 | 0 | 15 | 0 | 0 | 4 |
4 | 0 | 0 | 15 | 0 | 3 | 0 | 9 |
5 | 0 | 0 | 0 | 3 | 0 | 17 | 16 |
6 | 28 | 0 | 0 | 0 | 17 |