学习链接:https://oi-wiki.org/graph/concept/

带有步骤:最小生成树 - 哎呦哎(iui) - 博客园

概念:

边权和最小的生成树


(v:点   g:边  | 只有连通图(任意两顶点连通)有树,非连通图为森林)

怎么说呢,更习惯学姐讲题时的板子。可能这就是板子的传承吧

Kruskal        

按权值(边)排序,依次检查现在的点是否连在树里。没有,加入; 有,跳过。

并查集+边贪心

还可以判图连不连通

直到最小生成树中的边数等于总顶点数减1或是测试完所有边时结束,而当结束时如果最小生成树的边数小于总顶点数减1,说明该图不连通

#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 1e5 + 5;
int pre[maxn];struct node{int from, to, w;
}g[maxn];bool cmp(node a, node b){return a.w < b.w;
}void init(){for(int i = 1; i <= n; ++i){pre[i] = i;}
}int find(int x){if(pre[x] == x)return x;return pre[x] = find(pre[x]);
}// void merge(int x, int y){//看个人习惯,也可以写到kru内部
//     x = find(x);
//     y = find(y);
//     if(x != y)
//         pre[x] = y;
// }int kru(int n, int m){int ans = 0, cnt_edge = 0;sort(g, g + m, cmp);for (int i = 0; i < m; ++i){int x = g[i].from;int y = g[i].to;x = find(x), y = find(y);if(x != y){pre[x] = y;ans += g[i].w;++cnt_edge;if(cnt_edge == n - 1) {cout << ans;return;}}}cout << "没连通";
}int main(){init();return 0;
}

Prim        

和dij很像,优化也是用优先队列

点贪心

每次选取距离已加入点的最小的点
但这里需要减去点,让每个点只被加入一次,避免形成环

纯prim求的是最小生成树的值

输出方案需要记录每个点的 dis代表的是哪条边。

#define re(a) memset(a, 0, sizeof(a));
#define remax(a) memset(a, 0x3f, sizeof(a));
#define PII pair<int, int>
const int maxn = 1e4 + 5;int dis[maxn], e[maxn][maxn];
int n;
bool vis[maxn];
int ans;int prim(int s){remax(dis);re(vis);priority_queue<PII, vector<PII>, greater<PII>> q;dis[s] = 0;for (int i = 0; i < n; ++i){int u = -1, minx = 0x3f3f3f;for (int j = 0; j < n; ++j){//找到未访问点中距离最小的if(!vis[j] && dis[j] < minx){u = j;minx = dis[j];}}if(u == -1)return -1;vis[u] = true;ans += dis[u];for (int v = 0; v < n; ++v){//中间点if(!vis[v] && e[u][v] != 0x3f3f3f3f)dis[v] = min(dis[v], e[u][v]);}}return ans;
}

Boruvka

前两种的结合。适用于最小生成森林。

做题还没看到过,先放一下

板子题

[HAOI2006]聪明的猴子

很容易发现是点与点之间的关系,所以判最短距离中的最长,再与猴子对比可得答案

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1e7 + 5;
#define PII pair<int, int>
int pre[maxn];
int a[maxn];struct node {int from, to, w;
} g[maxn];bool cmp(node a, node b) {return a.w < b.w;
}void init(int n) {for (int i = 1; i <= n; ++i) {pre[i] = i;}
}int cnt = -1;int find(int x) {if (pre[x] == x)return x;return pre[x] = find(pre[x]);
}void kru(int n, int m) {int ans = 0, cnt_edge = 0;sort(g, g + m, cmp);for (int i = 0; i < m; ++i) {int x = g[i].from;int y = g[i].to;x = find(x), y = find(y);if (x != y) {pre[x] = y;ans = max(ans, g[i].w);++cnt_edge;if (cnt_edge == n - 1) {cnt_edge = 0;//回收利用,懒得定义新变量了,别学for (int i = 0; i < n; ++i) {if (a[i] >= ans)++cnt_edge;}cout << cnt_edge;return;}}}cout << 0;
}vector<PII> v;int lenth(PII a, PII b) {return (a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second);
}int main() {int m, n;cin >> m;for (int i = 0; i < m; ++i) {cin >> a[i];a[i] *= a[i];}cin >> n;for (int i = 0; i < n; ++i) {int k, b;cin >> k >> b;v.push_back({k, b});//要算两两之间的距离}for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {++cnt;g[cnt].from = i;g[cnt].to = j;g[cnt].w = lenth(v[i], v[j]);}}init(cnt);kru(n, cnt);return 0;
}

P2330 [SCOI2005]繁忙的都市

来理解一下题目:

1 + 2、改造的路需要形成树,且边数最小

3、分值尽可能小

裸板子

#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1e5 + 5;
int pre[maxn];struct node{int from, to, w;
}g[maxn];bool cmp(node a, node b){return a.w < b.w;
}void init(int n){for(int i = 1; i <= n; ++i){pre[i] = i;}
}int find(int x){if(pre[x] == x)return x;return pre[x] = find(pre[x]);
}void kru(int n, int m){int cnt_edge = 0;vector<int> ans;int t = 0;sort(g, g + m, cmp);for (int i = 0; i < m; ++i){int x = g[i].from;int y = g[i].to;x = find(x), y = find(y);if(x != y){pre[x] = y;ans.push_back(i);t = max(t, g[i].w);++cnt_edge;if(cnt_edge == n - 1) {cout << ans.size() << " " << t;return;}}}
}int main(){int n, m;cin >> n >> m;init(m);for (int i = 0; i < m; ++i){cin >> g[i].from >> g[i].to >> g[i].w;}kru(n, m);return 0;
}

最小生成树 解释 + 板子题相关推荐

  1. 7-14保持安全社交距离的重要性 最小生成树板子题

    在新冠疫情期间保持社交距离非常有必要,疾控专家普遍认为保持1米以上的距离可以有效减缓疫情传播.现在给定一些人的坐标,请你计算一下他们是否都安全,如果不安全,那么新冠病毒最快多久能感染所有人.为了方便计 ...

  2. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

    整理的算法模板合集: ACM模板 前面好几段又在讲故事- 题目大意: a[i]表示对手的每个队伍战斗力 p[i]表示打败对手后获得的分数 b[i]表示我方第一种人的战斗力 c[i]表示我方第二种人的战 ...

  3. 最小割板子题——[USACO5.4]奶牛的电信

    今天邱神给我们讲了图论,还讲了一下网络流算法.自己找了一个洛谷板子题. 题目描述农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存 ...

  4. 洛谷-P3975 弦论(后缀自动机板子题)

    弦论 一道板子题,让我感觉板子题都还不会...然后把递推写成dfs时没有给string加上&,导致内存爆了,2333,果然还是传引用好 题意:求字典序第K小子串以及本质不同的第K小子串 思路: ...

  5. 古有陈天华万字血书抗沙俄,今有本剧蒻万字背包虐dp(01,完全,多重,分组,混合等各种背包详解 + 板子题+ 奇奇怪怪滴变式题)

    前言: 本文介绍了01背包.完全背包.多重背包.混合背包.分组背包等背包,并对其进行透彻的剖析,并附上了板子题,供您白嫖,以及一些奇葩变式,颇有意思,供你琢磨玩弄.此外绝大部分题都有二维数组和滚动数组 ...

  6. 工作安排(反悔贪心板子题)

    工作安排 - 题目 - Daimayuan Online Judge 分析: 贪心,将set当链表用 从后往前考虑(这样先入队的就一直能到最后),碰到更小的时刻,就将之前入队的 能出的全出 #incl ...

  7. 猜灯谜_全排列板子题(A 村的元宵节灯会上有一迷题: 请猜谜 × 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字。 请你用计算机按小明的思路算一下,然后)

    题目描述 A 村的元宵节灯会上有一迷题: 请猜谜 × 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交"请猜 ...

  8. 树状数组板子题之一:hdu 1166 敌兵布阵

    树状数组板子题之一:hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手 ...

  9. 【迪杰斯特拉的优化】 洛谷4779板子题

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 最终,他 ...

最新文章

  1. python进阶(小白也能看懂)——装饰器浅谈(一)
  2. Winform 打印PDF顺序混乱,获取打印队列
  3. skysat重访周期_重访小恶梦
  4. 【渝粤题库】陕西师范大学200311常微分方程作业(高起本)
  5. python中__init__.py的作用、module和package
  6. Magento教程 10:如何修改网站文字?
  7. 【Keil】使用Keil5时出现的错误(持续更新)
  8. oracle内与外连接,Oracle (内连接)与(外连接)区别
  9. c语言程序设计-简单的c语言程序
  10. 2018年最新_5小时学会微信小程序视频教程网盘地址
  11. Matplotlib——绘制散点图并连线
  12. Kvaser、C++、Qt编写监控界面(一)
  13. 计算机专业毕业设计题目哪个简单,计算机专业毕业设计题目计算机专业毕业设计的类型...
  14. php 生成条码插件,PHP版条码生成器
  15. 在“https://money.cnn.com/data/markets/nasdaq/”抓取纳斯达克成分股数据并将数据表存到一个Excel表格中。
  16. BOM_创建更新物料清单脚本
  17. 如何分析关键词的优化难度?
  18. CSS基础:CSS的上下文之层叠上下文
  19. 大学计算机作业互评评语简短,大学学生互评评语简短
  20. cu3er 3D幻灯切换效果 div被遮住的解决方法

热门文章

  1. java 文件树百度知道_JAVA百度面试复盘--2020-07-30
  2. win10 安装 paddledetection 避免踩坑
  3. python爬虫进阶-1688工厂信息(JS逆向-sign签名验证)
  4. 下载pytorch的经历(20220514)
  5. 网易之幼儿园小朋友调整队形
  6. 秉火429笔记之十五 DMA--直接存储区访问
  7. python正则检验_Python 检测生僻字
  8. AI艺术简史·未来已来,只是分布不均而已…… [ 元宇宙创作者指南 ]
  9. arm9+linux s3c2440 触摸屏驱动移植
  10. 自来水中锰超标怎么办