模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时
合并:(我的祖先是的你的祖先的父亲)
找父亲:(初始化祖先是自己的,自己就是祖先)
查询:(我们是不是同一祖先)
路径压缩:(每个点只保存祖先,不保存父亲)
最小生成树kruskal:贪心算法+并查集数据结构,根据边的多少决定时间复杂度,适合于稀疏图
核心思想贪心,找到最小权值的边,判断此边连接的两个顶点是否已连接,若没连接则连接,总权值+=此边权值,已连接就舍弃继续向下寻找;
并查集数据结构程序:
#include<iostream>
#define re register
using namespace std; int f[],n,m,x,y,z; int father(int k)
{
if(f[k]==k)
return k;
else
return f[k]=father(f[k]);
} void close(int a,int b)
{
int fa,fb;
fa=father(a);
fb=father(b);
f[fa]=fb;
} void find(int a,int b)
{
if(father(a)==father(b))
cout<<'Y'<<endl;
else
cout<<'N'<<endl;
} int main()
{
cin>>n>>m;
for(re int i=;i<=n;i++)
f[i]=i;
for(re int i=;i<=m;i++)
{
cin>>x>>y>>z;
if(x==)
close(y,z);
else
find(y,z);
}
return ;
}
最小生成树kruskal算法程序
#include <iostream>
#include <stdio.h>
#include <algorithm> using namespace std;
int f[],ans=,s=;
struct node
{
int x;
int y;
int data;
}c[]; bool cmp(node a,node b)
{
return a.data<b.data ;
}
int father(int k)
{
if(f[k]==k)return k;
else
return f[k]=father(f[k]);
} bool find(int a,int b)
{
if(father(a)==father(b))
return true;
else
return false;
} void merge(int a,int b)
{
int fa,fb;
fa=father(a);
fb=father(b);
f[fa]=fb;
} int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++)
{
f[i]=i;
}
for(int i=;i<=m;i++)
{
cin>>c[i].x>>c[i].y>>c[i].data ;
}
sort(c+,c+m+,cmp);
for(int i=;i<=m;i++)
{
if(!find(c[i].x,c[i].y))
{
merge(c[i].x,c[i].y);
ans+=c[i].data;
s++;
}
if(s==n-)break;
}
if(s==n-)
cout<<ans;
}
模板——最小生成树kruskal算法+并查集数据结构的更多相关文章
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- POJ1861 Network (Kruskal算法 +并查集)
Network Description Andrew is working as system administrator and is planning to establish a new net ...
- 图论 Kruskal算法 并查集
#include<iostream> #include<cstring> #include<string> #include<cstdio> #incl ...
- poj1251 Jungle Roads Kruskal算法+并查集
时限: 1000MS 内存限制: 10000K 提交总数: 37001 接受: 17398 描述 热带岛屿拉格里山的首长有个问题.几年前,大量的外援花在了村庄之间的额外道路上.但是丛林不断地超 ...
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
[题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...
- 「luogu3402」【模板】可持久化并查集
「luogu3402」[模板]可持久化并查集 传送门 我们可以用一个可持久化数组来存每个节点的父亲. 单点信息更新和查询就用主席树多花 一个 \(\log\) 的代价来搞. 然后考虑如何合并两个点. ...
- 【转】最小生成树——Kruskal算法
[转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...
- 并查集与最小生成树Kruskal算法
一.什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个用于次数据结构的操作: Fi ...
- 数据结构:最小生成树--Kruskal算法
Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
随机推荐
- js和jq获取宽度和高度
Javascript: console.log(document.body.clientWidth); //网页可见区域宽(body) console.log(document.body.client ...
- [Java]private, public,protected,friendly的区别(转载)一下子就记住了
http://teddyboy200382.blog.163.com/blog/static/320112002008825112549780/ 说明这四个关键字之前,我想就 class 之间的关系做 ...
- IntelliJ IDEA开发工具println报错的解决方法
IntelliJ IDEA 编译 JSP,出现 out.println 报错,下图所示: 报错原因:println报红,这是因为没有关联好服务器! 解决方案:点击File->Project st ...
- Thrift-RPC client in Flume
Get RpcClient from RpcClientFactory with Reflection programming Message or Event definition in Flum ...
- 关于H5的自定义属性data-*
data-* 是H5的新属性,用来让开发者对标签添加自定义属性的. 其读写方式有如下几种: 如果是 data-abc 的格式,则采用正常格式 abc 来读写该属性值 <div id=" ...
- maven学习(七)后续扩展、资料
写这几篇博客的来源是 "maven实战 + 网上的博客 + 平时使用的心得 ".记录的都是比较常用的东西,也有一些只做了大概了解.或者干脆直接略过,在这里做一下总结,如果有需要在进 ...
- java中double类型显示两个小数,比如12.00
Double类型的数据如何保留两位小数? 各位大虾,现有Double类型的数据,如何转换为保留两位小数的数,返回值的类型仍然是Double类型的,而不是字符串类型. 比如 0,返回“0.00” ...
- Linux-->Mysql:安装,测试
环境准备 mysql下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar ...
- SAP Cloud for Customer Account和individual customer的区别
在SAP Cloud for Customer的Customers工作中心里,有三个视图:Accounts,Contacts和Individual Customers. 这三种主数据的区别是什么?我们 ...
- JavaScript 初学备忘录
JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现 ...