并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时

合并:(我的祖先是的你的祖先的父亲)

找父亲:(初始化祖先是自己的,自己就是祖先)

查询:(我们是不是同一祖先)

路径压缩:(每个点只保存祖先,不保存父亲)

最小生成树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算法+并查集数据结构的更多相关文章

  1. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  2. POJ1861 Network (Kruskal算法 +并查集)

    Network Description Andrew is working as system administrator and is planning to establish a new net ...

  3. 图论 Kruskal算法 并查集

    #include<iostream> #include<cstring> #include<string> #include<cstdio> #incl ...

  4. poj1251 Jungle Roads Kruskal算法+并查集

    时限: 1000MS   内存限制: 10000K 提交总数: 37001   接受: 17398 描述 热带岛屿拉格里山的首长有个问题.几年前,大量的外援花在了村庄之间的额外道路上.但是丛林不断地超 ...

  5. 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集

    [题目]D. Best Edge Weight [题意]给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它.n,m<=2*10^5,1&l ...

  6. 「luogu3402」【模板】可持久化并查集

    「luogu3402」[模板]可持久化并查集 传送门 我们可以用一个可持久化数组来存每个节点的父亲. 单点信息更新和查询就用主席树多花 一个 \(\log\) 的代价来搞. 然后考虑如何合并两个点. ...

  7. 【转】最小生成树——Kruskal算法

    [转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...

  8. 并查集与最小生成树Kruskal算法

    一.什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个用于次数据结构的操作: Fi ...

  9. 数据结构:最小生成树--Kruskal算法

    Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...

随机推荐

  1. AdvStringGrid入门使用

    仅仅把数据从数据库中显示到AdvStringGrid中 procedure TForm1.btnQueryClick(Sender: TObject); var i, j: Integer; begi ...

  2. javascprit form表单提交前验证以及ajax返回json

    1.今天要做一个手机验证码验证的功能.需求是前端页面点击发送 短信验证码,后台接收后通过ajax返回到前端,之后前端在提交时候进行验证.思路很简单,不过做的过程还是学到不少的东西. 1.ajax请求后 ...

  3. Android Studio 2.3.2 下载 - 百度网盘

    Android Studio是一个为Android平台开发程序的集成开发环境,其包含用于构建Android应用所需的所有工具. Android Studio 2.3.2为最新的稳定版(截止到2017年 ...

  4. Linq中的in和not in的使用方法

    T-SQL语句: select * from PayingRecords where ClientID='17787665-1d98-49e6-b254-a6a6553c4b42' and ID no ...

  5. DevExpress源码编译总结 z

    本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.baidu.com/s/1eQm1 ...

  6. Yii框架记录

    Yii框架记录 Yii 结构 使用yii开发一段时间,发现自身知其形不知其意,重温了下yii,理解框架,也可以梳理自己的知识库,借鉴成长,阶段性总结如下: 模型 模型是MVC模式中的一部分,是表现业务 ...

  7. HTTP(一)

    HTTP(一) http php http请求 HTTP请求:请求行.消息报头.请求正文.格式如下: Method Request-URI HTTP-Veraion CRLF 参数说明 Method ...

  8. JQuery里ajax的表单传值serialize()用法

          本文导读:在jQuery中,当我们使用ajax时,常常需要拼装 input数据以键值对(Key/Value)的形式发送到服务器,用JQuery的serialize方法可以轻松的完成这个工作 ...

  9. x:Name与Name区别

    x:Name与Name有两个不同点: 1.x:Name是Xaml的标记特性,任何在Xaml中定义的元素,都可以使用x:Name来为元素指定名称. Name是FrameworkElement定义的依赖项 ...

  10. Vue收藏资料

    组件库的全局引用和按需引用:http://www.cnblogs.com/zhuanzhuanfe/p/7516745.html