模板——最小生成树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算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
随机推荐
- 移动端meta标签的使用和设置
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale= ...
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
前言 这里讨论的优化问题指的是,给定目标函数f(x),我们需要找到一组参数x,使得f(x)的值最小. 本文以下内容假设读者已经了解机器学习基本知识,和梯度下降的原理. SGD SGD指stochast ...
- klee源码阅读笔记1--STPBuilder类
初始化过程中四个数据成员中的两个数据成员被初始化: 一.vc被初始化为STP提供的C调用接口函数vc_createValidityChecker(): 二.optimizeDivides被初始化为fa ...
- git 命令备忘
git 常用命令备忘 仅作为日常使用备忘,并非常用命名整理 删除源端分支 git push orgin --delete branch_a a分支某次提交应用到b分支 切换到branch_b 分支: ...
- Java—IO流 对象的序列化和反序列化
序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中 ...
- linux 软连接和硬链接示意图
创建软连接 ln -s 1.txt 1-softlink.txt 创建硬链接 ln 1.txt 1-hardlink.txt
- 缓存服务Ehcache方案
1 Ehcache简介 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java 开发).被认证 ...
- 关于cookie的详解
http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html
- PHP | 别家网站都有的登录功能,你的网站也可以有!
如果说一个网站是一个独立的王国,那登录功能就相当于这个[王国]的大门.进出往来的人必须要通过这道[门]才能进出这个[王国],这样才能有效的达到对人流量和用户的有效监管,也可以进一步了解每个用户的喜好, ...
- msvcr100.dll丢失原因及解决方法
msvcr100.dll为Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库.有些程序直接将其打包到了安装目录,并注册,就不会出 ...