最小生成树的方法一般比较常用的就是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. 使用移动自适应布局+easy mock实现移动界面的简单实现

    一.使用easy mock模拟数据 easy mock链接地址 二.自己写移动自适应布局 自己编写主要是利用rem进行宽度栅格布局: html { /* 相当于一个界面适配器,pc以及移动端都可以进行 ...

  2. D3.js实现拓扑图

    最近写项目需要画出应用程序调用链的网路拓扑图,完全自己写需要花费些时间,那么首先想到的是echarts,但echarts的自定义写法写起来非常麻烦,而且它的文档都是基于配置说明的,对于自定义开发不太方 ...

  3. 前端每日实战:26# 视频演示如何用不到 50 行 CSS 代码,创作按钮被从纸上掀起的立体效果

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KRbXGe 可交互视频教程 此视频 ...

  4. spring boot 过滤器 前后端分离跨域sessionId不一致

      import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http ...

  5. ElementUI el-table 在flex下的宽度自适应问题

    BUG:在flex容器下面的一个flex:1的子容器里面写了个el-table用来展示列表数据,在做宽度自适应测试的时候发现该组件的宽度只会增加不会缩小. Debug:通过控制台发现组件生成的tabl ...

  6. 3DGIS与BIM集成集成技术及铁路桥梁可视化系统

    3DGIS与BIM的集成技术 3DGIS与BIM的集成技术包括2部分:一是将Revit软件生成的BIM针对3DGIS的快速无损格式转换,这种转换包括几何信息(如形状.位置等信息)和属性信息(如建筑信息 ...

  7. 【colab pytorch】使用tensorboard可视化

    import datetime import torch import torch.nn as nn import torch.nn.functional as F import torch.opti ...

  8. oracle12c数据库第一周小测验

    一.单选题(共4题,30.4分) 1 (  )是位于用户与操作系统之间的一层数据管理软件.数据库在建立.使用和维护时由其统一管理.统一控制.   A. A.DBMS B. B.DB C. C.DBS ...

  9. HashMap底层源码剖析

    HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ...

  10. Code Index: 基于Lucene.Net的代码检索工具

    目录 用途 Github地址 示例 特性 用途 维护一个拥有巨大代码量的项目, 依靠自带的代码搜索工具搜索速度缓慢, 一个快速的代码检索工具就显得极为必要, 所以自己撸了个小工具. Github地址 ...