图论 —— 生成树 —— 增量最小生成树
【概述】
所谓最小增量生成树问题,即:给定包含 n 个点的空图,依次加入 m 条带权边,每次加入一条边,就输出当前图中最小生成树的权值,如果没有生成树,则输出无解
求解最小增量生成树的方法是:根据最小生成树的回路性质,在原有最小生成树的基础上,每次增加一条边就会构成一个回路,那么去掉这个回路上权值最大的边,得到的就是新的最小生成树。
简单来说,每一次加边之前先跑一遍 Kruskal 找最小生成树,若已经有最小生成树,则新加入的边肯定会让其形成环,这时候开始进行删边操作,删去那个多余的边即可。
【模版】
struct Node {int u,v;int val;bool operator<(const Node& rhs)const {return val<rhs.val;}
} edge[N];
int n,m,cnt;
int father[N];
int Find(int x) {if(father[x]==x)return x;return father[x]=Find(father[x]);
}
void Kruskal() {sort(edge,edge+cnt);int pos=-1;int res=0,mst=0;for(int i=0; i<cnt; i++) {int u=edge[i].u,v=edge[i].v;int x=Find(u),y=Find(v);if(x!=y) {father[x]=y;res++;mst+=edge[i].val;} else {pos=i;continue;}}if(pos!=-1) edge[pos]=edge[--cnt];if(res!=n-1)printf("-1\n");elseprintf("%d\n",mst);
}
int main() {scanf("%d%d",&n,&m);cnt=0;for(int i=0; i<m; i++) {//添m次边scanf("%d%d%d",&edge[cnt].u,&edge[cnt].v,&edge[cnt].val);cnt++;for(int i=0; i<N; i++)father[i]=i;Kruskal();//每次添边跑一次Kruskal}return 0;
}
图论 —— 生成树 —— 增量最小生成树相关推荐
- 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...
点击上方蓝字,和我一起学技术. 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到这些术语和概念往往会很头疼. ...
- 数据结构实验之图论九:最小生成树
数据结构实验之图论九:最小生成树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 有n个城市,其中有些城市之间可以修建公 ...
- 图论 —— 生成树 —— 曼哈顿距离最小生成树
[概述] 当给出一些二维平面的点时,记两点间距离为曼哈顿距离,此时的最小生成树,称为曼哈顿最小距离生成树. 对于 n 个点来说,最朴素的做法是暴力求出所有所有点两两之间的曼哈顿距离,然后再跑最小生成树 ...
- 图论 —— 生成树 —— 最小生成树 —— Prim
[基本思想] Prim 算法基本思想是蓝白点思想,用白点代表已进入最小生成树的点,蓝点代表未进入最小生成树的点. 每次循环都将一个蓝点 u 变为白点,并且此蓝点 u 与白点相连的最小边权 min[u] ...
- 图论 —— 生成树 —— 最小生成树 —— Kruskal
[基本思想] Kruskal 算法基本思想是并查集思想,将所有边升序排序,并认为每一个点都是孤立的,分属 n 个独立的集合. 按顺序枚举每一条边,如果这条边连接的两个点分属两个不同的集合,那么就将这条 ...
- 【图论专题】最小生成树的扩展应用
整理的算法模板合集: ACM模板 最小生成树的扩展应用 能用kruskal打死不用prim kruskal是要把所有的边都遍历一遍 图论中的超级源点就比较常用,要时刻想到它 题目列表: 题目 算法 A ...
- 【图论专题】最小生成树及其简单应用
整理的算法模板合集: ACM模板 题目列表: 题目 算法 AcWing 1140. 最短网络 prim模板 AcWing 1141. 局域网 kruskal模板 AcWing 1142. 繁忙的都市 ...
- 生成树、最小生成树的一些性质以及邻域的概念
设一个无向连通图G=(V,E),顶点个数记作m,边的数量为n.其对应的最小生成树记作f. 则生成树T的性质有: 边数量为m-1 没有圈 加入任何一条边都会形成一个圈 对于一颗生成树T,定义 操作:在其 ...
- 数据结构实验之图论九:最小生成树(Prim/Kruskal)
Description 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的.现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市. ...
最新文章
- 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?
- Linux系统结构 详解
- Spread for Windows Forms快速入门(1)---开始使用Spread
- python函数应用实例_【Python 第22课】 函数应用示例
- html英文字体汇总,笔记 CSS常用中文字体英文名称对照表
- Javaspring 7-13课 Spring Bean
- hdfs mv命令_Hadoop2.x HDFS shell命令
- 进销存系统怎么部署到自己服务器,进销存软件云存储和自建服务器
- 商城开发-用户管理模块(2)
- 数字化赋能全零售 国美按下战略加速键
- Python反转链表
- XtuningTheBert
- 一元三次、四次方程求解
- 优先队列优化迪杰斯特拉
- aid learning如何换源
- 宁海元 mysql_每公斤约360元 宁海香榧可以品尝了
- Git 每次提交都需要输入密码
- 如何下载Direct3D9Ex
- 小程序的老祖宗PWA为什么没有火起来?
- 怎样清理苹果电脑磁盘空间_Macbook苹果电脑提示磁盘空间不足怎么办【解决方法】...