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

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

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

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

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

最小生成树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. Sqlite 数据库分页查询(ListView分页显示数据)

    下面介绍一下我的这个demo. 流程简述: 我在raw文件夹下面放了名称为city的数据库,里面包含全国2330个城市,以及所属省,拼音简写等信息. 首先 在进入MainActivity的时候,创建数 ...

  2. 【JAVA语法】03Java-继承性

    继承的实现 继承的限制 子类对象的实例化 方法的重写 Super关键字 重写与重载的区别 final关键字 抽象类 接口 一.继承的实现 1.1 格式 class 子类 extends 父类 {} c ...

  3. pt-mysql-summary

    pt-mysql-summary主要用来输出MySQL的基本信息,可以作为数据库巡检以及刚开始熟悉数据库环境时候进行使用: [root@mxqmongodb2 bin]# ./pt-mysql-sum ...

  4. MySQL数据操作(借鉴)

    /* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld ...

  5. M-wordL-图

    典型的需要使用图模型 将start 和 end 以及字典一同构建成图,然后探究从start到end的最短路径

  6. Python机器学习神器:sklearn&numpy

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDE0MDMzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. BZOJ 2120 数颜色 【带修改莫队】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: ...

  8. mybatis动态sql语句学习(一)

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...

  9. 十八、IntelliJ IDEA 常用快捷键 之 Windows 版

    IntelliJ IDEA(简称 IDEA),是 Java 语言开发的集成环境,IDEA 在业界被公认为最好的 Java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持.各类版本 ...

  10. PAT——1005. 继续(3n+1)猜想

    pat原题目:https://www.patest.cn/contests/pat-b-practise/1005 原题目: 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况 ...