
图论-最小生成树
AcerMo
一只辣鸡大学生
展开
-
POJ 1287 Networking
题目大意,一个网络中,一些节点间存在网路,你现在需要找出一条可以连接所有点的最短网路,多组样例循环输入,很显然一道最小生成树,正好没发过最小生成树的模板。先讲一下最小生成树,最小生成树基于一张图,最简单的裸题会保证图的连通性,所以不需要再向图中加边,你的任务是在m条边中选择n-1条边来连接这n个点,并且保证不存在另一条路,边权之和小于这条路径的边权和,这里讲一下kruskal算法,kruskal算...原创 2018-04-01 08:43:12 · 178 阅读 · 0 评论 -
TYVJ1659中中救援队
特殊Kruskal最小生成树不难发现,不考虑最后回到起点,每个点要被经过度数次,也就是说一条边连接两个点 ,这两个点要各被经过一次,所以我们将一条边的边权就可以变成边权*2+cost[x]+cost[y]也就是说经过两遍,再加上一开始救人时爬坑的花费,然后显然爬出起点的花费最小最优,所以我们找一个爬出时间最小的点当起点,跑最小生成树即可代码//By AcerMo#include<cm...原创 2018-09-17 20:05:34 · 303 阅读 · 0 评论 -
BZOJ1083&&洛谷P2330 [SCOI2005]繁忙的都市
最小生成树,裸的//By AcerMo#include<cmath>#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int M=10...原创 2018-09-03 09:38:45 · 210 阅读 · 0 评论 -
BZOJ1196&&洛谷P2323 [HNOI2006]公路修建问题
最小生成树,跑了两遍而已233第一遍用一级公路跑最小生成树,凑够k条边就跳出,然后把剩下的边,按二级公路跑最小生成树,然后记录max就好了BZOJ没有让输出方案,贡献了一发OLE代码//By AcerMo#include<cmath>#include<queue>#include<cstdio>#include<cstring&g...原创 2018-08-31 19:03:06 · 241 阅读 · 0 评论 -
BZOJ3714 [PA2014]Kuglarz
不难发现,我们只需要n个区间覆盖掉1~n即可,然后学长用脑洞yy到了最小生成树上,询问[i,j]后就在i-1和j之间连边,观察到如果L和R在同一联通块中,则必定知道[L,R]的奇偶性,题目转化为最小生成树问题。 然后就A了,代码易懂,放心代码//By AcerMo#include<cmath>#include<queue>#include<cstdio...原创 2018-08-16 20:24:43 · 269 阅读 · 0 评论 -
纪中OJ 5771【NOIP2008模拟】遨游
看到题是一个求区间,我就果断想了二分,我们二分一个下界,看在这个下界的限制下是否还有边可以连接起点和终点于是我们转到了判断连通性还要保证最大边边权最小的问题,显然这是一棵最小生成树,只需要记录第一条联通起点所在块与终点所在块的边的边权,这就是R注意点:二分的左端点要设成0,因为会有优惠完后边权小于一的边,之后二分时可以联通l=mid+1,否则r=mid,我因为把这个玩意写成了l=mid ,...原创 2018-08-08 12:30:50 · 496 阅读 · 0 评论 -
BZOJ1821&&洛谷P4047 [JSOI2010]部落划分
看完题后,大体思路是将离得近的居住点合并成部落,知道有m个部落如何实现呢?发现合并离得最近的居民点,这不是最小生成树吗?只不过最小生成树要求剩一个联通块,这道题要求剩m个而已其他都一样,只不过在有m个部落后,输出下一个连接两个联通块的边就好代码//By AcerMo#include<cmath>#include<queue>#include<c...原创 2018-07-30 14:27:15 · 237 阅读 · 0 评论 -
BZOJ1050&&洛谷P2502 [HAOI2006]旅行
这道题一眼看过去,应该是最小生成树没错了,我们可以暴力的枚举一下选哪些边,期望得分40~50正解是什么呢?我们将边按照边权排序,因为我们要在保证联通的条件下,使得costmax/costmin最小,所以我们要让最小边尽量大的情况下,使得最大边尽量小,如何实现呢?我们发现,因为边权数组已经排好序,所以权值是递增的,所以我们可以选择一些小边权的边不选,看是否还能连通,这样就可以实现在最小边扩大的同时,...原创 2018-07-12 20:18:09 · 290 阅读 · 0 评论 -
BZOJ1601&&洛谷P1550 [USACO08OCT]打井Watering Hole
kruskal裸题我们将在每个点打井费用看作是从0号点连向当前点的一条边,每个井之间连边,然后跑一遍最小生成树,ans就是最终答案代码//By AcerMo#include<cmath>#include<queue>#include<cstdio>#include<cstring>#include<iostream>#incl...原创 2018-07-12 19:48:42 · 283 阅读 · 0 评论 -
POJ2728Desert King
最优比率生成树问题,就是01分数规划在树上的应用是一类求解在树上选一些边,是这些边的花费比长度最大的问题,多次prime就好代码//By AcerMo#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usin...原创 2018-07-04 10:35:19 · 716 阅读 · 0 评论 -
BZOJ1016&&洛谷P4208 [JSOI2008]最小生成树计数
emmm数据太水,直接爆搜有一个定理:无论最小生成树由哪些边组成,其中使用的每种边权的边的数量是一定的所以由此我们可以得到一种做法:记录最小生成树使用的每种边的数量,然后dfs使用这些边去构建另一棵最小生成树代码//By AcerMo#include<cmath>#include<queue>#include<cstdio>#include<cst...原创 2018-07-01 21:21:38 · 344 阅读 · 0 评论 -
BZOJ2753&&洛谷P2753滑雪
中文题意不再赘述说一下做题思路,题目大意是求一个最小生成树,题目规定只能滑向小于等于的点,那么说明图中存在双向边和单向边,输入的时候要判断两个点的高度然后由题意我们知道,我们必须由1号点出发,那么我们必定有一些点去不了,那么这些点会干扰我们做题,尤其是干扰最小生成树,那么我们可以从1号点开始扩展,因为我们输入边的时候已经确定了高度关系,所以扩展的时候不需要考虑高度,因为我们从一开始扩展,那么能扩展...原创 2018-06-25 17:26:26 · 284 阅读 · 0 评论 -
BZOJ3732Network
和洛谷1967一样,只不过是求一个最小生成树,然后和上一道题一样,先构建新图,然后lca求到祖先距离的最大值代码//By AcerMo#include<cmath>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<iostrea...原创 2018-06-16 17:24:53 · 313 阅读 · 0 评论 -
洛谷P1967货车运输
这道题 首先不难看出要先求一个最大生成树,因为我们在尽量图联通的情况下,使两点之间有一条权值最大的边,所以Kru跑一遍最大生成树;然后会有很显然的事情就是裸的生成树只能求总和,但我们需要知道树上有哪条边,所以在合并两个联通块时,将两个端点以及他们间的边加入另一个图中,那么显然新图中只包含最大生成树上的边,然后就是求两点之间的最长边,一个比较暴力的做法是floyed求任意两点间的最长边,但我们观察到...原创 2018-06-16 16:50:29 · 340 阅读 · 0 评论 -
POJ 3723 Conscripyion
和2377一样最大生成树代码By Acer.Mo#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>using namespace std;const int M=500500;struct edge{ ...原创 2018-04-01 09:17:56 · 206 阅读 · 0 评论 -
POJ 1679 次小生成树
题目大意,t组样例输入,n个点m条边,求除最小生成树以外的最短边。暴力,可劲暴力,数据水,暴力出奇迹模拟不选每条最小生成树中的边,取最小代码By Acer.Mo#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#...原创 2018-04-01 09:06:24 · 198 阅读 · 0 评论 -
POJ 2377 Bad Cowtractors
题目大意 n个点m条边,选择一些边来使边权和最大,只能选n-1条边,显然最大生成树(笑哭),又是模板题,和最小生成树唯一不同的就是将优先队列的重载运算符反向重载,将最大的边放在队首,其实也可以在存边的时候每条边都加一个负号,然后跑最小生成树,输出时再加一个负号。代码By Acer.Mo#include<iostream>#include<cstring>#include...原创 2018-04-01 08:58:41 · 132 阅读 · 0 评论 -
TYVJP1666城市建设
这题写的不明不白的应该是Kruskal因为我也没太搞懂咋做当我在废话就好了我们对于两个本来就有边的城市,考虑先在哪个城市建房对于两个城市i,j,我们先在i建房的代价是h[i]∗(st[i]+st[j])+h[i]∗(st[i]+1+st[j])+...+h[i]∗(st[i]+ed[i]−st[i]+st[j])h[i]*(st[i]+st[j])+h[i]*(st[i]+1+st[j]...原创 2018-09-18 12:46:48 · 326 阅读 · 0 评论