关于最小生成树(并查集)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的主要内容,如果未能解决你的问题,请参考以下文章

模板——最小生成树kruskal算法+并查集数据结构

HDU 1233 还是畅通工程(最小生成树, Prim+优先队列 || Kruskal+并查集)

POJ 3723 Conscription (Kruskal并查集求最小生成树)

kruskal:最小生成树

P3366 模板最小生成树 (贪心+并查集,kruskal)

P3366 模板最小生成树 (贪心+并查集,kruskal)