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

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

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

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

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

最小生成树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. Redhat Linux 7.3 虚拟机通过USB挂载NTFS格式的移动硬盘

    分为如下几个步骤: 一.设置本地yum,安装gcc(如果本机已经安装gcc,则跳过此步) 在虚拟机连接linux iso安装盘 查看光盘挂载情况 mkdir /iso mount /dev/cdrom ...

  2. idea 出现 java.noSuchMechodFound

    公司 用了多个项目来相互之间形成依赖.每次修改或者添加新功能,会升级版本.用的是maven,这几天 一直 出现一个问题就是:本地 升级版本完后 使用 git命令 mvn -deploy -e 打包后, ...

  3. 关于YARN的基本结构

  4. git rebase vs git merge详解

    https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa#.std3ddz0g 请参考另外一篇文 ...

  5. mysql 配置详解

    [client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...

  6. Linux 安装问题

    问题1: root>sudo apt-get install yum 提示: dpkg was interrupted, you must manually run 'sudo dpkg --c ...

  7. PHP-Gealman

    一.简介 Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manu ...

  8. 【深入理解JAVA虚拟机】第5部分.高效并发.2.线程安全和锁优化

    1 概述 对于这部分的主题“高效并发”来讲,首先需要保证并发的正确性,然后在此基础上实现高效. 2 线程安全 <Java Concurrency In Practice> 的作者Brian ...

  9. 为tcp的connect设置超时时间

    struct timeval tv = {timeout, 0}; 27   setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(s ...

  10. C#导入PFX和Cer证书的工具类

    代码: public class CertificationHelper { public static bool importPFX(string certPath, string certPass ...