关于最小生成树(并查集)prime和kruskal
Posted maxv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于最小生成树(并查集)prime和kruskal相关的知识,希望对你有一定的参考价值。
适合对并查集有一定理解的人. 新手可能看不懂吧....
并查集简单点说就是将相关的2个数字联系起来
比如
房子 1 2 3 4 5 6
能通向的房子 2 3 4 5 6 1
主要 建立并查集的 函数结构 模板(一般不变除非加权--最好能理解)
for(int i=0;i<n;i++)
flag[i]=i; //标记数组初始化以方便寻根
1 int find(int x) X相当于1 2 { 3 int r=x,t; r代表的是根节点 4 while(x!=flag[x]) 如果 没有找到 就继续追到根为止 5 x=flag[x]; 6 while(r!=x) 7 { //这里是相关优化 有个定义叫做秩就是类似于楼的层数 秩越低 你就越容易从楼顶走到楼底 将秩全部变成1即一层楼 8 t=flag[r]; 9 flag[r]=x; 10 r=t; 11 } 12 return x; 13 }
主要就是这个
最小生成树中 keruskai()
核心思想: 将所有元素按照某一标志 排序 然后从最前开始一次检索寻根如果
二者没有相同的根就说明他们是第一次相互关联 然后把它们的权加到sum上
举例 : 你要把3个房间打通来让 别人 可以去任意房间..
这些房间没有房顶你能飞到任意房间去砸墙 但是他们的关联情况不同并且 花费的费用也不同
你要使他们的费用最低
1. A B 10万元 2. B C 20万元
3. A C 30万元
你可以
1,2 30
1,3 40
2,3 50
显然选择 1,2
就用上面的kruskal
排序后 先是 a-b 判断是否有相同根(打通?)没有 就打通 10万元 然后
b-c 判断是否有相同的根 没有就打通 然后继续判断
a-c 判断已经打通了 跳过...
(当然也可以加一个sum统计打通情况3个房间 2个通道就行 打通一次sum++;当sum=n-1直接跳过节省时间)
prime 还没理解透彻先过来占个时间....
以上是关于关于最小生成树(并查集)prime和kruskal的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1233 还是畅通工程(最小生成树, Prim+优先队列 || Kruskal+并查集)
POJ 3723 Conscription (Kruskal并查集求最小生成树)