【OI】Kruskal & ufs (克鲁斯卡与并查集)
Kruskal是有关于最小生成树的算法。
这个算法非常好理解,用一句话来概括就是:
从小到大找不同集合的边。
那么,具体是怎样的呢。
1.先把所有顶点初始化为一个连通分量。
2.从所有边中选择最小的(指权值)边,判断该边是否已经在当前构造的连通分量中,如果是,则放弃这条边,找下一条边。
3.重复第二步,直到所有点都被纳入到当前构造的连通分量中。
所以,这样的算法涉及到了查询当前边是否在集合中和合并一条边到集合中。
于是想到了并查集。
先贴并查集代码,并查集的思想是用一个父亲数组:fa[i]代表节点i的父亲,以此将某节点并为某节点儿子来合并,查询。
#include<iostream>
using namespace std;
int par[],ran[];
void init(int N)
{
for(int k=;k<N;k++)
{
par[k]=k;
}
}
int find(int x)
{
if(par[x]==x)
{
return x;
}
else
{
return find(par[x]);
}
}
void unionn(int x,int y)
{
x=find(x);
y=find(y);
if(ran[x]<ran[y])
{
par[x]=y;
}
else
{
par[y]=x;
if(ran[x]==ran[y])
{
ran[x]++;
}
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int main()
{
int n,m,a,b,c;
cin>>n>>m;
init(n+);
for(int i=;i<m;i++)
{
cin>>a>>b>>c;
if(a==)
{
unionn(b,c);
}
else
{
if(same(b,c))
{
cout<<"Y"<<endl;
}
else
{
cout<<"N"<<endl;
}
}
}
return ;
}
并查集代码
然后,我们需要根据这份代码来进行克鲁斯卡算法。
根据之前的思路,可以写出这样的算法:
void kruskal(){
sort(e+1,e+m+1,cmp);
int sum = 0;
int num = 0;
for(int i = 1;i <= m;i++){
int s = e[i].s;
int t = e[i].t;
if(!same(s,t)){
printf("连接%d,%d\n",s,t);
sum += e[i].v;
union_(s,t);
num++;
}
if(num >= n-1) break;
}
printf("最小生成树权值和为%d,共有%d个节点",sum,num);
}
看起来似乎很好理解。
这也是一个贪心的思想。
【OI】Kruskal & ufs (克鲁斯卡与并查集)的更多相关文章
- POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19884 Accepted: 83 ...
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- 算法笔记--可撤销并查集 && 可持久化并查集
可撤销并查集模板: struct UFS { stack<pair<int*, int>> stk; int fa[N], rnk[N]; inline void init(i ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10
搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1 ...
- 稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...
- 稠密图(邻接矩阵),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...
随机推荐
- css hack解决方案
现在大家做项目的时候估计很多都已经不怎么考虑兼容问题,大多数的公司都已经舍弃ie7.8了,都是从ie9+开始,所以说不会有那么多的兼容问题需要去解决了,但是由于本人力求完美的工作习惯,做项目的时候还是 ...
- PC端样式重置
html{font-family:"Microsoft YaHei UI","Microsoft YaHei",sans-serif;-ms-text-size ...
- Html、Css、JavaScript 遇到的问题总结
$('body').scrollTop()无效得解决方案 鼠标滑轮获取到得值为0:var scrollTop = $('body').scrollTop(); 在页面中加一个随着页面滚动条滚动的小图片 ...
- codeforces 407 div1 B题(Weird journey)
codeforces 407 div1 B题(Weird journey) 传送门 题意: 给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环.问满 ...
- UVa 806 四分树
题意: 分析: 类似UVa 297, 模拟四分树四分的过程, 就是记录一个左上角, 记录宽度wideth, 然后每次w/2这样递归下去. 注意全黑是输出0, 不是输出1234. #include &l ...
- UVA 253 Cube painting(枚举 模拟)
题意: 按如图的顺序给定2个骰子的颜色(只有r.b.g三种颜色) 问2个骰子是否一模一样 如 可表示为“rbgggr” 和 “rggbgr”, 第二个就是绕着Z轴顺时针旋转90度与第一个相同的骰子. ...
- Vue页面骨架屏(二)
实现思路 参考原文中在构建时使用 Vue 预渲染骨架屏一节介绍的思路,我将骨架屏也看成路由组件,在构建时使用 Vue 预渲染功能,将骨架屏组件的渲染结果 HTML 片段插入 HTML 页面模版的挂载点 ...
- Jmeter-接口测试实例讲解
一.测试需求描述 1. 本次测试的接口为http服务端接口 2. 接口的主要分成两类,一类提供给查询功能接口,一类提供保存数据功能接口,这里我们举例2个保存数据的接口,因为这两个接口有关联性,比较有代 ...
- 确定协议-通过分析系统阶段需要知道该系统能不能进行性能测试-Omnipeek
- Linux下汇编语言学习笔记5 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...