适合对并查集有一定理解的人. 新手可能看不懂吧....
并查集简单点说就是将相关的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 301,3 402,3 50显然选择 1,2 就用上面的kruskal排序后 先是 a-b 判断是否有相同根(打通?)没有 就打通 10万元 然后 b-c 判断是否有相同的根 没有就打通 然后继续判断 a-c 判断已经打通了 跳过...(当然也可以加一个sum统计打通情况3个房间 2个通道就行 打通一次sum++;当sum=n-1直接跳过节省时间) prime 还没理解透彻先过来占个时间....
原文地址:https://www.cnblogs.com/maxv/p/10612258.html
时间: 2024-10-03 23:43:41