[算法模版]Prim-完全图最小生成树

众所周知,对于常用的Kruskal算法,算法复杂度为\(O(m \log m)\)。这在大多数场景下已经够用了。但是如果遇到及其稠密的完全图,Prim算法就能更胜一筹。

Prim算法也可以使用很多数据结构进行优化。但是对于完全图来说,这写优化都无足轻重。暴力的Prim算法的\(O\left(n^{2}+m\right)\)就足够了。

Prim算法也很简单。就是每次考虑把一个加入一个点到已经建成的生成树。可以证明如果选择一个不在当前生成树,且离当前生成树最近的点加入生成树一定最优。

例题:【模板】最小生成树

for(int i=0;i<=n;i++)dis[i]=1e18;
dis[s]=0;
while(1) {#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=5005;
vector<pair<int,int> >side[maxn];
int n,m,vis[maxn];
long long dis[maxn],ans;
int main() {
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++) {
int u,v,w;cin>>u>>v>>w;
side[u].push_back(make_pair(v,w));
side[v].push_back(make_pair(u,w));
}
memset(dis,0x3f,sizeof(dis));
int s=1;
dis[s]=0;//dis[i]代表一个未加入联通块的点到联通块的最近距离
while(1) {
int now=0;
for(int i=1;i<=n;i++)if(!vis[i]&&dis[i]<dis[now])now=i;//取一个dis最小的(显然这个点满足通过一条边就能到达联通块,且这条边最小)
if(!now)break;//所有点都走过 退出
ans+=dis[now];//代表走连接联通块和now之间的边,累计答案
vis[now]=1;//标记这个点 代表这个点并入联通块
for(int i=0;i<side[now].size();i++) {
int v=side[now][i].first,w=side[now][i].second;
if(!vis[v])dis[v]=min(dis[v],1ll*w);//更新不在联通块内的点的dis
}
}
cout<<ans;
}
int now=0;
for(int i=1;i<=n;i++)if(!vis[i]&&dis[i]<dis[now])now=i;//取一个dis最小的
vis[now]=1;
if(now==0)break;
for(int i=1;i<=n;i++)if(!vis[i]){
dis[i]=min(dis[i],get_dis(now,i));
}
}

[算法模版]Prim-完全图最小生成树的更多相关文章

  1. 最小生成树MST算法(Prim、Kruskal)

    最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...

  2. 图论算法(五)最小生成树Prim算法

    最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...

  3. 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

  4. 查找最小生成树:普里姆算法算法(Prim)算法

    一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...

  5. 算法之prim算法

    最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小. prim算法就是一种最小生成树算法. 普里 ...

  6. Kruscal算法求图的最小生成树

    Kruscal算法求图的最小生成树 概述   和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...

  7. 普利姆算法(prim)

    普利姆算法(prim)求最小生成树(MST)过程详解 (原网址) 1 2 3 4 5 6 7 分步阅读 生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程 ...

  8. 普里姆算法(Prim)

    概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...

  9. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

随机推荐

  1. Java连载53-单例模式初步、final关键字补充、回顾知识点

    一.回顾 1.类和对象的区别 2.UML(uniform makeup language) 3.方法区存储静态变量.常量(static final修饰) 4.堆内存中存储对象 5.栈存储变量 6.th ...

  2. 洛谷 P2176(最短路)

    ###题目链接 洛谷 P2176 ### 题目大意: 已知农夫从 1 走到 N 点,一定走的是最短路.问你将某条路的长度变为其两倍后,农夫从 1 走到 N 点的路程最大增加多少,输出最大增量. 分析: ...

  3. 配置文件和sqlplus简单使用

    oracle简单配置文件 数据文件目录 D:\app\inmeditation\oradata\orcl 以.CTL结尾得的文件是数据库的控制文件 以.LOG结尾的是数据库日志文件 以.DBF结尾的是 ...

  4. vue中$refs的用法及作用详解

    一般来讲,获取DOM元素,需要使用document.querySelector('#input1')方法去获取dom节点,然后再获取input1的值. 但是使用了ref绑定之后,我们就不需要再获取do ...

  5. MongoDB for OPS 01:服务介绍与基本使用

    写在前面的话 数据库产品已经学习了两个,MySQL 和 Redis.接下来开始研究另外一款 NoSQL 产品 MongoDB,注意跟芒果没啥关系.该产品对于运维来说,相对于操作少一些. 关于 Mong ...

  6. [ida]查看某一函数在程序中被谁引用

    1. 点亮函数名 2.view - open subviews - cross references 注意:不要点击绘图那个

  7. oracle学习笔记(十九) 子程序——存储过程

    子程序--存储过程 我们可以使用子程序来封装一下我们需要的操作,子程序又有存储过程,函数和触发器. 这里先学习存储过程~ 语法 create [or replace] procedure $proce ...

  8. 3 JDK并发包

    JDK内部提供了大量实用的API和框架.本章主要介绍这些JDK内部功能,主要分为3大部分: 首先,介绍有关同步控制的工具,之前介绍的synchronized就是一种同步控制手段,将介绍更加丰富的多线程 ...

  9. 最近的项目系之3——core3.0整合Senparc

    1.前言 既然是.net下微信开发,自然少不了Senparc,可以说这个框架的存在, 至少节省了微信相关工作量的80%.事实上,项目开始前,还纠结了下是Java还是core,之所以最终选择core,除 ...

  10. 零零总总遇到过的CSS 样式

    1:添加弹出框阴影 2:禁止文本域缩放 3:直接使用CSS 完成文本内容大小写(针对英文) 4: 文本框中的占位符 5:让table每列一样高 6:不使用js 让内容换行 word-break 7:曾 ...