是什么:

  • 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。

kruskal算法:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
struct node {int x,y,t;
};
int n,m,fa[100001];
int mincost;
bool cmp(node a,node b) {return a.t<b.t;
}
int find(int x) {if(fa[x]==x) return x;else return find(fa[x]);
}
int main() {while(cin>>n) {if(n==0) return 0;mincost=0;memset(fa,0,sizeof(fa));vector<node> g;cin>>m;for(int i=1; i<=n; i++) fa[i]=i;int x,y,t;for(int i=1; i<=m; i++) {cin>>x>>y>>t;g.push_back((node) {x,y,t});}sort(g.begin(),g.end(),cmp);for(int i=0; i<g.size(); i++) {int u=g[i].x;int v=g[i].y;double w=g[i].t;if(find(u)!=find(v)) {mincost+=w;fa[find(u)]=find(v);}}cout<<mincost<<endl;}
}

时间复杂度:O(mlogm) m为边数

prim算法:

#include<iostream>
#include<cstring>
using namespace std;
bool vis[101];
int n,x,y,z,ans=0,d[101]={1,},g[101][101];
int prim(int s){int index=s;vis[s]=true;for(int i=1;i<=n;i++)d[i]=g[s][i];for(int i=1;i<n;i++){int minn=99999999;for(int j=1;j<=n;j++){if(!vis[j]&&d[j]<minn){minn=d[j];index=j;}}vis[index]=true;ans+=minn;for(int j=1;j<=n;j++){if(!vis[j]&&d[j]>g[index][j]){d[j]=g[index][j];}}}
}
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>g[i][j];}}prim(1);cout<<ans;return 0;
}

时间复杂度:O(n^2)
主要用于稠密图,尤其是完全图的最小生成树

拓展:次小生成树

普及版:

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int inf=1e9;
struct node{int u,v,w,vis;
}e[20010];
vector<int> g[2005];
int n,m,fa[2005],len[2005][2005];
int minn,nd;
bool cmp(node a,node b) {if(a.w!=b.w)return a.w<b.w;if(a.u!=b.u)return a.u<b.u;return a.v<b.v;
}
int find(int x) {if(x!=fa[x])return fa[x]=find(fa[x]);return fa[x];
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);}sort(e+1,e+m+1,cmp);for(int i=0;i<=n;i++){g[i].clear();g[i].push_back(i);fa[i]=i;}minn=0;for(int i=1;i<=m;i++){int x=find(e[i].u);int y=find(e[i].v);if(x!=y){e[i].vis=1;minn+=e[i].w;int a=g[x].size();int b=g[y].size();for(int j=0;j<a;j++)for(int k=0;k<b;k++)len[g[x][j]][g[y][k]]=len[g[y][k]][g[x][j]]=e[i].w;fa[x]=y;int cpy[110];for(int j=0;j<b;j++)cpy[j]=g[y][j];for(int j=0;j<a;j++)g[y].push_back(g[x][j]);for(int j=0;j<b;j++)g[x].push_back(cpy[j]);}}nd=inf;for(int i=1;i<=m;i++)if(!e[i].vis)nd=min(nd,minn+e[i].w-len[e[i].u][e[i].v]);printf("%d\n",nd);return 0;
}

提高版:

严格次小生成树

博客

Boruvka算法:

博客

时间复杂度:O((n+m)logn)

常用于解决这类问题:给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出,求最小生成树。

题目
题解

MST(最小生成树)的构造相关推荐

  1. UVA 1151 Buy or Build MST(最小生成树)

    题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...

  2. bzoj1937: [Shoi2004]Mst 最小生成树

    也是神了.感觉一天都在好神的题里面游荡. 本来是想复习一下KM的,结果一眼过去??? 结果做法是这样的,把树边和非树边分成两个集合 根据贪心的思想,要搞的话肯定树边减少,而非树边增加. 对于在原树中的 ...

  3. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

  4. BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

    传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} ...

  5. MST(最小生成树)上的确定性和存在性问题

    题目1: 给定一个n个点m条边的连通图,保证没有自环和重边.对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上.假如最大权值为无限大,则输出-1. 题解: ...

  6. 【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)

    题干: 众所周知,Applese 是个很强的选手,它的化学一定很好. 今天他又AK了一套题觉得很无聊,于是想做个毒气炸弹玩. 毒气炸弹需要 k 种不同类型元素构成,Applese一共有 n 瓶含有这些 ...

  7. 普利姆算法(prim)求最小生成树(MST)过程详解

    生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生 ...

  8. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理

    蛮不错的一道题,遗憾就遗憾在数据范围会导致暴力轻松跑过. 最小生成树的两个性质: 不同的最小生成树,相同权值使用的边数一定相同. 不同的最小生成树,将其都去掉同一个权值的所有边,其连通性一致. 这样我 ...

  9. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt

    算法与程序设计实验最小生成树(c语言).ppt 最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因 ...

最新文章

  1. 浙大版《C语言程序设计(第3版)》题目集 练习2-17 生成3的乘方表 (15 分)
  2. R语言计算回归模型每个样本(观察、observation、sample)的DFFITS度量实战:忽略单个观察(样本)时,回归模型所做的预测会发生多大的变化
  3. Entity Framework技术系列之1:数据访问技术概述
  4. crypto——明文攻击
  5. 笔记-项目范围管理-项目范围说明书
  6. 运维自动化 第二章 openpyxl的用法,读写excel内容
  7. 30+ 新鲜惊奇的 jQuery 插件与教程
  8. markdown 入门1--标题目录代码图片
  9. Speed Up YUM!
  10. schema的详解2
  11. AIS (船舶自动识别系统Automatic Identification System)数据解析
  12. 政府大数据服务,跑马圈地正当时
  13. cocos2d 3.11获取机型和系统版本号
  14. Java自动化测试系列[v1.0.0][TestNG测试开发环境配置]
  15. python画素描画_使用Python将图片变成铅笔素描
  16. Android 开源优秀项目
  17. 当前中国计算机硬件发展情况,中国计算机硬件技术发展与展望.doc
  18. 数据告诉你哪里才是中国最热的火炉城市?
  19. 记忆化结果再利用 进一步探讨递推关系
  20. 2019年西工大计算机机试题(C语言)

热门文章

  1. sql datetime 排序_超全的数据库建表/SQL/索引规范,建议贴在工位上!
  2. [蓝桥杯2015初赛]移动距离
  3. [蓝桥杯2016初赛]冰雹数-模拟
  4. 程序无法启动ALL_BUILD 拒绝访问
  5. 新方法-根据上排给出十个数,在其下排填出对应的十个数
  6. Codeforces Round #674 (Div. 3) F. Number of Subsequences 简单计数dp
  7. 【CF594E】Cutting the Line 【贪心】【Lyndon Word】【扩展kmp】
  8. 牛客练习赛74 E CCA的期望(算概率的技巧+floyd处理)
  9. CF1088F. Ehab and a weird weight formula(倍增)
  10. gym103117L. Spicy Restaurant