定义

在一给定的无向联通带权图\(G = (V, E, W)\)中,\((u, v)\) 代表连接顶点 \(u\) 与顶点 \(v\) 的边,而 \(w(u, v)\) 代表此边的权重,若存在 \(T\) 为 \(E\) 的子集,且为无循环图,使得 \(w(T)\) 最小,则此 \(T\) 为 \(G\) 的最小生成树。

其中\(w(T)=\sum\limits_{(u,v)∈t} w(u,v)\)

由定义易得,\(T\)中的边数为 顶点个数\(-1\)。

实现算法常用\(Kruskal\)和\(Prim\)

\(Kruskal\)算法

将边按权值从小到大排序再依次放入图中,当整个图只有一个连通分量时,程序结束。

实现方法:

  • 1.找到\(E\)中最小边
  • 2.判断边的两点是否在同一连通分量中
  • 3.若在,舍弃此边,转1。
  • 4.若不在,添加此边,将端点所在连通分量合并。
  • 5.所有边全选完后,若选边数为n-1,则输出解,否则无解处理。

代码:

#include <bits/stdc++.h>
using namespace std;
const int EDG=1000010;
const int VER=100010;
int n,m;
struct edge
{
int _start;
int _end;
int _weigh;
} arc[EDG];/*结构体存边,便于排序*/
bool cmp(edge a,edge b)
{
return a._weigh<b._weigh;
}
int parent[VER];
inline void init();
inline int find(int x);
int union_(int x,int y);
inline bool search_(int x,int y); int main()
{
init();
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>arc[i]._start>>arc[i]._end>>arc[i]._weigh;
}
if(m<n-1)//如果不够n-1条边,直接无解
{
cout<<"orz";
return 0;
}
sort(arc+1,arc+1+m,cmp);//权值排序
int num=0;
int ans=0;
for(int i=1;i<=m;i++)
{
if(!search_(arc[i]._start,arc[i]._end))//如果边的端点不在同一个连通分量中
{
ans+=arc[i]._weigh;//选择这条边
union_(arc[i]._end,arc[i]._start);//合并两个连通分量
num++;//选择的边数 +1
}
}
if(num==n-1)//最小生成树只可能有n-1条边
{
cout<<ans;
}
else cout<<"orz";
} /*----------并查集相关----------*/
inline void init()
{
for(int i=0;i<=VER;i++)
{
parent[i]=i;
}
}
inline int find(int x)
{
int x_root=x;
while(x_root!=parent[x_root])
{
x_root=parent[x_root];
}
while(x!=x_root)
{
int tmp=parent[x];
parent[x]=x_root;
x=tmp;
}
return x_root;
}
int union_(int x,int y)
{
int x_root=find(x);
int y_root=find(y);
if(x_root==y_root) return 0;
parent[x_root]=y_root;
return 1;
}
inline bool search_(int x,int y)
{
return find(x)==find(y);
}

\(Prim\)算法

其实就是\(dijksrta\)的变种,配合理解即可

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int edg[1010][1010];
int dis[100010];
int vis[100010];
int n; void prim()
{
int sum=0;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) dis[i]=edg[1][i];
vis[1]=1;
dis[1]=1;
for(int i=1;i<n;i++)
{
int minn=INF;
int u;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&minn>dis[j])
{
u=j;
minn=dis[j];
}
}
vis[u]=1;
sum+=minn;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&edg[u][j]<dis[j])
{
dis[j]=edg[u][j];
}
}
}
cout<<sum;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>edg[i][j];
}
}
prim();
return 0;
}

最小生成树MST的更多相关文章

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

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

  2. POJ 1679 The Unique 次最小生成树 MST

    http://poj.org/problem?id=1679 题目大意: 给你一些点,判断MST(最小生成树)是否唯一. 思路: 以前做过这题,不过写的是O(n^3)的,今天学了一招O(n^2)的,哈 ...

  3. 最小生成树(MST)[简述][模板]

    Prim(添点法) 1. 任选一点(一般选1), 作为切入点,设其与最小生成树的距离为0(实际上就是选一个点,将此树实体化),. 2. 在所有未选择的点中选出与最小生成树距离最短的, 累计其距离, 并 ...

  4. 【算法与数据结构】图的最小生成树 MST - Prim 算法

    Prim 算法属于贪心算法. #include <stdio.h> #define VERTEXNUM 7 #define INF 10000 typedef struct Graph { ...

  5. MST最小生成树及克鲁斯卡尔(Kruskal)算法

    最小生成树MST,英文名如何拼写已忘,应该是min spaning tree吧.假设一个无向连通图有n个节点,那么它的生成树就是包括这n个节点的无环连通图,无环即形成树.最小生成树是对边上权重的考虑, ...

  6. Hdu 4081 最小生成树

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  7. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  8. 最小生成树算法prim and kruskal

    一.最小生成树定义:  从不同顶点出发或搜索次序不同,可得到不同的生成树  生成树的权:对连通网络来说,边附上权,生成树也带权,我们把生成树各边的权值总和称为生成树的权  最小代价生成树:在一个连通网 ...

  9. CF1108F MST Unification

    题目地址:CF1108F MST Unification 最小生成树kruskal算法的应用 只需要在算法上改一点点 当扫描到权值为 \(val\) 的边时,我们将所有权值为 \(val\) 的边分为 ...

随机推荐

  1. 面试被问:如果系统 CPU 突然飙升且 GC 频繁,你该如何排查?

    出自:开源中国 原文:系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题. ...

  2. 全球疫情爬取APP版

    全球疫情统计APP图表展示: 将该任务分解成三部分来逐个实现: ①爬取全球的疫情数据存储到云服务器的MySQL上 ②在web项目里添加一个servlet,通过参数的传递得到对应的json数据 ③设计A ...

  3. JS 移动端笔记

    移动端的网页特效     移动端触屏事件概述 触屏touch事件     touchstart 手指触摸到一个DOM元素时触发     touchmove 手指在一个DOM上滑动时触发     tou ...

  4. 小白学习Python之路---py文件转换成exe可执行文件

    一.背景 今天闲着无事,写了一个小小的Python脚本程序,然后给同学炫耀的时候,发现每次都得拉着其他人过来看着自己的电脑屏幕,感觉不是很爽,然后我想着网上肯定有关于Python脚本转换成可执行文件的 ...

  5. JS与React分别实现倒计时(天时分秒)

    JS方法 html部分 <div class="clock"> <i></i> 天 <i></i> : <i> ...

  6. JavaFX桌面应用-为什么应用老是“未响应”

    日常使用软件的过程中,偶尔会遇到软件突然卡住,再点击几次就变成"未响应"的情况. 在JavaFX应用中同样也会出现这种情况,在开发过程中应该尽量避免这种情况的出现. >> ...

  7. win10 安装msys2 和 ruby

    1.选择自己的版本 https://rubyinstaller.org/downloads/ Ruby+Devkit 2.5.1-2 (x64) Ruby+Devkit 2.5.1-2 (x86) 2 ...

  8. markdown基础使用技巧

    markdown基础使用技巧 通过``创建代码形式,不同形式可以叠加(比如:斜体+加粗) 块级元素 通过return/Enter实现切换段落/创建段落 通过shift+return/enter 实现换 ...

  9. golang安装及vscode编辑器配置

    安装Go语言及搭建Go语言开发环境 下载 下载地址:https://studygolang.com/dl 系统选择: 根据不同系统下载安装包: 安装 Windows MAC安装 点开可执行程序 下一步 ...

  10. ping通网关 ping不通dns

    一.Request Timed Out 当Ping指定的对象时,出现“Request Timed Out”提示信息的频率非常高,这说明对方无法接受发送过来的数据.当然这种情况下,很可能就是网络出现了故 ...