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算法模板的更多相关文章

  1. 无向带权图的最小生成树算法——Prim及Kruskal算法思路

    边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权. 最小生成树(MST):权值最小的生成树. 生成树和最小生成树的应用:要连通n个城市需要n-1条边线路.可以 ...

  2. 图的最小生成树(Prim、Kruskal)

    理论: Prim: 基本思想:假设G=(V,E)是连通的,TE是G上最小生成树中边的集合.算法从U={u0}(u0∈V).TE={}开始.重复执行下列操作: 在所有u∈U,v∈V-U的边(u,v)∈E ...

  3. [数据结构]最小生成树算法Prim和Kruskal算法

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树.  例如,对于如上图G4所示的连通网可以有多棵权值总 ...

  4. 图的最小生成树的理解和实现:Prim和Kruskal算法

    最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...

  5. poj1861 最小生成树 prim &amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是 #include <cstdio> #includ ...

  6. 最小生成树--Prim及Kruskal

    //prim算法#include<cstdio> #include<cmath> #include<cstring> #include<iostream> ...

  7. 算法(图论)——最小生成树及其题目应用(prim和Kruskal算法实现)

    题目 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销? Kruskal算法 特点 适用于稀疏图,时间复杂度 是nlogn的. 核心思想 从小到大选取不会产生环的边. 代码实现 代码中 ...

  8. prim和kruskal算法

    //邻接矩阵 int n,G[MAXV][MAXN]; int d[MAXV];//表示到树的距离 bool vis[MAXV]={false}; int prim(){ fill(d,d+MAXV, ...

  9. 最小生成树(II)与Kruskal算法

    为防止网页加载过慢,故分两章.上接https://www.cnblogs.com/Uninstalllingyi/p/10479470.html Kruskal算法——将森林合并成树 玩过瘟疫公司吗… ...

随机推荐

  1. vue 动态数据绑定

    动态数据绑定(一) 我的github iSAM2016 实现的步骤: 1.监听对象属性的读取与变化 Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的 ...

  2. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  3. 是true还是false呢?

    古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...

  4. 图片瀑布流,so easy!

    什么是图片瀑布流 用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子: 简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有 ...

  5. 单(single):换根dp,表达式分析,高斯消元

    虽说这题看大家都改得好快啊,但是为什么我感觉这题挺难.(我好菜啊) 所以不管怎么说那群切掉这题的大佬是不会看这篇博客的所以我要开始自嗨了. 这题,明显是树dp啊.只不过出题人想看你发疯,询问二合一了而 ...

  6. 用python实现你的绘画梦想

    导语: ​ 你是否还在为当时年少时没有选择自己的梦想而伤心,是否还在为自己的无法成为绘画名家而苦恼,这一切都不需要担心.python都能帮你实现,诶!python怎么能画画呢,一些简单的图案没问题,但 ...

  7. windows下同时装了Python3和Python2,如何区分使用?

    1.前言 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.exe改个名字,这样区分开两个可执行文件的名字,但 ...

  8. 曹工杂谈:为什么很少需要改Spring源码,因为扩展点太多了,说说Spring的后置处理器

    前言 最近发了好几篇,都是覆盖框架源码,但是spring的代码,我是从没覆盖过,毕竟,如果方便扩展,没谁想去改源码,而spring就是不需要改源码的那个,真的是"对扩展开放,对修改关闭&qu ...

  9. Python - selenium自动化-Chrome(headless)

    什么是 Headless Chrome Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序.相比于现代浏览 ...

  10. Css3动画-@keyframes与animation

    一.@keyframe 定义和用法 @keyframes是用来创建帧动画的,我们通过这个属性可以用纯css来实现一些动画效果. 一般格式是: @keyframes 动画名称{ 0%{ 动画开始时的样式 ...