【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板
Luogu最小生成树模板题
Prim
原理与dijkstra几乎相同,每次找最优的点,用这个点去松弛未连接的点,也就是用这个点去与未连接的点连接。
#include<cstdio>
#include<vector>
using namespace std;
struct data
{
int to,val;
};
vector<data> edge[200001];
int n,m,cost[5001],ans;
bool visit[5001];
void add(int x,int y,int z)
{
data tmp;
tmp.to=y;
tmp.val=z;
edge[x].push_back(tmp);
}
void init()
{
scanf("%d%d",&n,&m);
int x,y,z;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
}
void First()
{
for (int i=1;i<=n;i++) cost[i]=0xfffffff;
cost[1]=0;
}
void prim()
{
for (int i=1;i<=n;i++)
{
int mincost=0xfffffff;
int mini=0;
for (int j=1;j<=n;j++)
if (mincost>cost[j]&&!visit[j]) mincost=cost[j],mini=j;
visit[mini]=true;
ans+=cost[mini];
for (int j=0;j<edge[mini].size();j++)
if (!visit[edge[mini][j].to]&&cost[edge[mini][j].to]>edge[mini][j].val)
cost[edge[mini][j].to]=edge[mini][j].val;
}
}
int main()
{
init();
First();
prim();
printf("%d",ans);
return 0;
}
Kruskal
运用并查集,存储边,以权值为关键字进行排序,从小到大查看边,如果这条边的两个点不在同一集合内,就加入同一集合并压缩路径。
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct data
{
int str,to,val;
}edge[200001];
int n,m,father[5001],ans,cnt;
bool comp(data a,data b)
{
return a.val<b.val;
}
void init()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].str,&edge[i].to,&edge[i].val);
}
}
int getfather(int v)
{
if (father[v]!=v) father[v]=getfather(father[v]);
return father[v];
}
void hb(int x,int y)
{
x=getfather(x);
y=getfather(y);
father[x]=y;
}
bool check(int a,int b)
{
a=getfather(a);
b=getfather(b);
if (a==b) return true;
return false;
}
int main()
{
init();
for (int i=0;i<=n;i++)
father[i]=i;
sort(edge+1,edge+1+m,comp);
for (int i=1;i<=m;i++)
{
if (!check(edge[i].str,edge[i].to))
{
hb(edge[i].str,edge[i].to);
ans+=edge[i].val;
cnt++;
}
}
if (cnt<n-1) printf("orz");
else printf("%d",ans);
return 0;
}
【2018寒假集训Day 8】【最小生成树】Prim和Kruskal算法模板的更多相关文章
- 无向带权图的最小生成树算法——Prim及Kruskal算法思路
边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...
- 图的最小生成树(Prim、Kruskal)
理论: Prim: 基本思想:假设G=(V,E)是连通的,TE是G上最小生成树中边的集合.算法从U={u0}(u0∈V).TE={}开始.重复执行下列操作: 在所有u∈U,v∈V-U的边(u,v)∈E ...
- [数据结构]最小生成树算法Prim和Kruskal算法
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总 ...
- 图的最小生成树的理解和实现:Prim和Kruskal算法
最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...
- poj1861 最小生成树 prim & kruskal
// poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...
- 最小生成树--Prim及Kruskal
//prim算法#include<cstdio> #include<cmath> #include<cstring> #include<iostream> ...
- 算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)
题目 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? Kruskal算法 特点 适用于稀疏图,时间复杂度 是nlogn的. 核心思想 从小到大选取不会产生环的边. 代码实现 代码中 ...
- prim和kruskal算法
//邻接矩阵 int n,G[MAXV][MAXN]; int d[MAXV];//表示到树的距离 bool vis[MAXV]={false}; int prim(){ fill(d,d+MAXV, ...
- 最小生成树(II)与Kruskal算法
为防止网页加载过慢,故分两章.上接https://www.cnblogs.com/Uninstalllingyi/p/10479470.html Kruskal算法——将森林合并成树 玩过瘟疫公司吗… ...
随机推荐
- python 读取文件夹中的文件内容
看thinking in java的时候发现有个题的答案不确定结果, 于是下载答案看下,结果是 这个样子的,这样要怎么才能找到相对应的答案?于是我就着手写了一个快速遍历的脚本(我这里只是单纯的找了出来 ...
- JdbcTemplate实现增删改查操作
JdbcTemplate介绍 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data-JP ...
- Java基础(二十七)Java IO(4)字符流(Character Stream)
字符流用于处理字符数据的读取和写入,它以字符为单位. 一.Reader类与Writer类 1.Reader类是所有字符输入流的父类,它定义了操作字符输入流的各种方法. 2.Writer类是所有字符输出 ...
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
- PHP 类中使用全局变量和全局常量
<?php $global_var = "var"; define('global_const', 'const'); class Test { public $_var; ...
- 第八篇 Flask中的蓝图
随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的.这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦.如下示例:我们在一个文件中写入多个路由,这会使代码维护变得困难. 如图所示,如 ...
- CSPS模拟 88
今天我还是个弟弟. 果然唯有AK不可超越.. T1 决策单调性,暴力上整体二分. 极限数据跑的挺快,可是被n<k的脑残测试点qj了.. T2 又是大模拟! T3 想到剩余同种数量的彩球完全等效 ...
- NOIP模拟13
上来看了一遍题,发现T2似乎不可做...暴力只给20分怎么玩? T1感觉是要离线处理,但是看了一会发现不会,遂决定先打暴力.然后去把T2 20分拿了,回去看T1,手摸了一下样例,成功推出式子,5分钟码 ...
- Docker的Ubuntu16.04容器如何汉化
最近发现docker hub中的vnc镜像大部分是没有安装语言包的,试了好多天才把他搞出来. 下面为实现步奏. 网盘软件地址 ://pan.baidu.com/share/link?shareid=3 ...
- Java基础系列5:Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...