最小生成树的方法一般比较常用的就是kruskal和prim算法

一个是按边从小到大加,一个是按点从小到大加,两个方法都是比较常用的,都不是很难。。。

kruskal算法在本文里我就不讲了,本文的重点是讲讲prim算法,之前一直没学过,只是了解了思想,原本以为很难,结果很好理解

prim 即可以用过邻接矩阵又可以用邻接链表,不过邻接链表的时间优化不了多少,但是还是可以优化很多空间的

prim算法是先枚举第一个点,将选好的点加入点集V,没选的点在点集U,然后在U集中找距离V集最近一个点,然后将其加入U集

我们还是用图来举例说明

我们来模拟一遍这个过程。。。

首先,lowcost表示从当前点到V集的最小距离,mst表示当前点到V集最小的那个V集的点

我们先从1点开始。。。

判断和1点相连的点,lowcost[2]=6,lowcost[3]=1,lowcost[4]=5,lowcost[5]=lowcost[6]=inf

           mst[2]=1,mst[3]=1,mst[4]=1;

然后跑整个图的点,找到最小的lowcost并将这个点加入V集,从U集删除(删除操作即为把lowcost赋值为0)

因为V集多了3,就更新整个图lowcost[2]=5,lowcost[4]=5,lowcost[5]=6,lowcost[6]=4;

             mst[2]=3,mst[4]=1,mst[5]=3,mst[6]=3;

然后找整个U集发现lowcost最小是6点,V集加入6点,更新U集

lowcost[2]=5,lowcost[4]=2,lowcost[5]=6

mst[2]=3,mst[4]=6,mst[5]=3

然后找lowcost最小的4点,加入V集,更新U集

lowcost[2]=5,lowcost[5]=6

mst[2]=3,mst[5]=3

找lowcost最小的点2,加入V集,更新U集

lowcost[5]=3,mst[5]=2

加入V集,所有点都已经加入,完成操作,输出ans=15

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdlib>
#define maxn 1005
using namespace std; int n,m,dis[maxn][maxn],ans;
int lowcost[maxn],mst[maxn]; int read(){
int xx=,ff=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')ff=-;ch=getchar();}
while(ch>=''&&ch<=''){xx=xx*+ch-'';ch=getchar();}
return xx*ff;
} void prim(int u){
for(int j=;j<=n;j++){
if(dis[u][j]>){
lowcost[j]=dis[u][j];mst[j]=u;
}
}
mst[u]=;lowcost[u]=;
int minid=,minn=0x3f3f3f,tot=;
while(tot<n){
minid=,minn=0x3f3f3f;
for(int i=;i<=n;i++){
if(lowcost[i]!=&&lowcost[i]<minn){
minn=lowcost[i];
minid=i;
}
}
tot++;
ans+=minn;
mst[minid]=;lowcost[minid]=;
for(int i=;i<=n;i++){
if(lowcost[i]!=&&dis[minid][i]<lowcost[i]){
lowcost[i]=dis[minid][i];
mst[i]=minid;
}
}
}
} int main(){
n=read();m=read();
memset(dis,0x3f3f3f,sizeof(dis));
for(int i=;i<=m;i++){
int x,y,v;
x=read();y=read();v=read();
dis[x][y]=dis[y][x]=v;
}
prim();
printf("%d\n",ans);
}
/*
6 10
1 3 1
1 2 6
1 4 5
2 3 5
3 4 5
2 5 3
3 5 6
5 6 6
3 6 4
4 6 2
*/

prim

[讲解]prim算法<最小生成树>的更多相关文章

  1. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  2. 6)图[2]Prim算法[最小生成树]

    Prim 算法 求解方法: 首先将所指定的起点作为已选顶点,然后反复在满足如下条件下的边中选择一条最小边,直到 所有顶点已成为已选顶点为止(选择n-1条边). #include "iostr ...

  3. 数据结构:最小生成树--Prim算法

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  4. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  5. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  6. 最小生成树之Prim算法--蓝白点思想

    Prim算法: 以前一直不是很明白,Prim算法,今天就来终结一下. Prim算法采用与Dijkstra.Bellman-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进 ...

  7. 最小生成树Prim算法Kruskal算法

    Prim算法采用与Dijkstra.Bellamn-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点. 算法分析 & 思想讲解: Prim算法每次 ...

  8. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  9. 最小生成树——prim算法

    prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...

随机推荐

  1. Java面试必问之Hashmap底层实现原理(JDK1.8)

    1. 前言 上一篇从源码方面了解了JDK1.7中Hashmap的实现原理,可以看到其源码相对还是比较简单的.本篇笔者和大家一起学习下JDK1.8下Hashmap的实现.JDK1.8中对Hashmap做 ...

  2. 不一样的ZTree,权限树.js插件

    每一个有趣的创新,都源于苦逼的生活. 在最近的工作中,遇到一个做权限管理筛选的需求.简单总结需求:1展示一个组织中的组织结构2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想 ...

  3. Object-Oriented Programming Summary Ⅱ

    电梯作业总结博客 17373492 电梯,多线程学习中的 "HelloWorld",早在大一就有所耳闻,以至于在坐电梯的时候就思考过:电梯需要怎么写呢? 0. 前言: 偶然的机会, ...

  4. 一份简明的 Base64 原理解析

    书接上回,在 记一个 Base64 有关的 Bug 一文里,我们说到了 Base64 的编解码器有不同实现,交叉使用它们可能引发的问题等等. 这一回,我们来对 Base64 这一常用编解码技术的原理一 ...

  5. new Date在IE下面兼容问题

    昨天碰到一个bug,用art-template模板进行渲染时候,周视图任务展示失败,都是暂无任务,我以为是模板兼容问题,但最开始我用的时候记得就是IE8的兼容性问题,引入es5-shim.min.js ...

  6. Redis系列四 - 分布式锁的实现方式

    前言 分布式锁一般有3中实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 以下将详细介绍如何正确地实现Redis分布式锁. 可靠性 首先,为了确保分布式锁的可 ...

  7. 关于form表单:hover没有修改表单子元素样式

    原来在写todolist的时候遇到的一个问题 是关于form表单的hover属性设置背景颜色 想要实现的效果如下: 但是一开始直接给form加hover选择器的时候是这样: 可以看到这样子直接加会使得 ...

  8. flask 部署外部访问

    在 app.run(host='0.0.0.0',port=5000) 可以让外部客户端进行访问,访问地址是flask服务器的ip地址和你设置的端口(端口注意不要占用其他端口,如果是阿里云有可能要设置 ...

  9. 等宽字体的妙用-loading 点点点动画

    原理 ch等宽字体 + text-indent 动画负缩进 显示效果如 loading . loading .. loading ... loading . loading .. loading .. ...

  10. Redis06——Redis到底能用在什么地方(上)

    之前我们介绍了一些列关于Redis的数据结构.持久化.过期&淘汰策略.集群化等知识点,感兴趣的小伙伴可以在文章的末尾查看往期内容.今天将为大家带来Redis的应用.由于本篇文章较长,所以将拆分 ...