你只有非常努力才能看起来毫不费力。
https://www.luogu.org/problemnew/show/P1265
上面的洛谷链接就是一个欧几里得生成树,注意这道题目里面的第二个条件是不成立的!!!
一:什么是欧几里得生成树?(大概是这么个意思吧)
就是给你n个包含x、y轴的坐标,将这些点连成最小生成树,如此生成树就是欧几里得生成树。我们的目的是记录最小生成树上的总的路径和。
二:解题过程
接下来我就写下我自己求欧几里得最小生成树的一些历程:
1:kruskal行不行呢?对于这道题目不可以,因为是5005个点,那么要push进队列5005*5005-1条边,会MLE。开始自己打了一个kruskal就MLE了,难受。
2:然后那毫无疑问了,用prim。很多prim模板里面都是设一点为起点p,建立结构体。结构体里面存储的是一个点的序号以及这个点到源点p的最小距离,然后用优先队列进行维护。
3:但是最后我们要记录最小生成树上的路径和,该怎样处理呢?
- 好吧,一切从头开始。我们先从源点出发,将除源点外所有点都遍历一遍,将源点到下一个点j的距离保存在dis[j]里面。
- 然后用vis数组将源点标记为1;
- 我们再从还未标记(还没有以这个点为起点更新它周围的点的一个点)的点i里面找到dis[i]最小的那个。然后再用这个点更新那些没有被标记的点j。i到j的距离为len,if