![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论 - 最小生成树、并查集
文章平均质量分 57
Crossing over
这个作者很懒,什么都没留下…
展开
-
CCF CSP 201703 4.地铁修建
这道题一开始想用dfs+动态规划做,然而发现很难控制,要么无限展开造成死循环,要么更新不充分。结合动态规划的想法,想到了spfa的bfs做法。然而我现在证明不出来为什么它就对。还是做的题太少了。第一个,dfs 错误的代码,还请路过的朋友指出正确的写法。#include <iostream>#include <vector>#include <algorithm>using namespace原创 2017-03-24 12:13:00 · 3942 阅读 · 9 评论 -
HDU 1102 Constructing Roads
传送门3371的弱化版,怎么都能过。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAXN = 1e2 + 3;const int INF = 1e9;int dis[MAXN][MAXN];int N, Q;int d[M原创 2017-04-08 21:34:16 · 161 阅读 · 0 评论 -
HDU 3938 Portal
传送门找两点间最长边(一条路径)的最小值(所有路径),这个值的意义在本题中相当于这两点可以在某种意义上连通了,然后给定一个值L问你最多能连通多少种两点。 需要注意的是L不是和的上限,而是单个两点间费用的上限。所以只用想有多少种两点间的费用小于等于L就行了。 而两点间的费用必然等于某条边的权值。 要知道,边的权值按从小到大离散分布,那么L可以退化到某个小于等于它的边的权值上。 所以,每次uni原创 2017-04-10 14:17:45 · 289 阅读 · 0 评论 -
HDU 4081 Qin Shi Huang's National Road System
传送门这个题也是类似求A/B比值最优的问题,应该不能简单贪心求解,就只好枚举喽。 A是某条边上两点的点权之和,B是在上述两点已经连通的情况下图的最小生成树的值。想让A/B最大。 枚举每条边,也就枚举了每种可能的A,有两种情况: - 该边是mst上的边,在这两点已经确定的情况下,B的最小值就是mst的值减去该边的权值。(借助kruskal算法可以理解) - 该边不是mst上的边,此时mst原创 2017-04-10 23:27:33 · 268 阅读 · 0 评论 -
HDU 1811 Rank of Tetris
传送门给定点之间的关系,让你判断序列是否唯一或者非法。 注意的是 点之间相等的话总是可以根据另一种关系排序,所以如果某些点相等的话就不用考虑他们之间的关系了(他们之间的排序是唯一且固定的),而且他们在总排序上是连续的。 所以相等的一些点可以看成一个连通分量,采取“缩点”的思想,他们可以由其中的一个点代表。 所以问题就是,怎么判断有环(也是非法的一种),怎么判断不唯一,怎么判断“绝对非法”(就是原创 2017-04-09 23:18:57 · 201 阅读 · 0 评论 -
HDU 4126 Genghis Khan the Conqueror
传送门这个题借鉴了别人思想自己写的,题目大意是,给定图,保证每两点之间最多有一条直接相连的边,先给出原始图,然后Q次更新,每次增加某条边的权值,每次更新独立,求出本次的mst值,最后求平均。 所以问题就是根据每次更新以及原始mst求最新mst。两种情况, - 更新边不是原始mst上的。所以还是原始mst的值。 - 更新边是原始mst上的。因为更新一定是增加,所以这时这条边可能有一条原始ms原创 2017-04-18 21:40:35 · 356 阅读 · 0 评论 -
HDU 2489 Minimal Ratio Tree
传送门这题不会。还以为有什么方法能直接搞出来最小的ratio以及那些点,结果就是枚举,不过就算是枚举我也写不出来啊~ 主要的思想就是dfs选择m个点,而且更重要的是 不是中途选够了m个点就怎么样怎么样,而是必须搞到最后一层,这样select的值才完备了,所以中间可以剪枝,比如如果选了m+1个点就可以直接return了,比如如果现在已选的加上接下来都选也达不到m也可以return了(这个没实现)。原创 2017-04-10 16:22:23 · 267 阅读 · 0 评论 -
HDU 1829 A Bug's Life
传送门这道题网上主要有两种方法,我都想了一遍,写点总结,我自己看。第一种是找到的一种好理解的方法,sex[a]=b相当于点a的原配是b,之后若出现a c,就把c和sex[a]=b合并,相当于情敌之间合并到一起,因为是情敌了,所以肯定是同性了,之后若有点对在同一集合那么就错误了。 这种思想是完全等价于题目要求,同性对的判定,只有出现在情敌之间才能被判定出来,情敌包括直接情敌(三角)和间接情敌(奇环,原创 2017-04-23 18:39:16 · 2103 阅读 · 0 评论 -
PAT T1016 Uniqueness of MST(35)
传送门无向图,判断其mst的唯一性,若没有mst则输出连通分量数。结论:只有当原图中存在权值相等的边的情况下,才有可能会造成mst不唯一。还是原来的kruskal算法,但是设置一个两层循环来从小到大遍历边,其中内层循环遍历的都是权值相同的边(神似PAT A1009,在一个有序数列中合并“同类项”。。)使用两个这样的内层循环:前者在上一次外层循环的状态下测试每条边的可用性;(计数变量ed...原创 2019-06-04 23:34:05 · 654 阅读 · 0 评论 -
HDU 1856 More is better
传送门找最大连通分量,没有一对pairs就输出1。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAXN = 1e7 + 2;int pre[MAXN];int pairs;int opt;int f(int x){原创 2017-04-08 21:25:53 · 190 阅读 · 0 评论 -
关于判定4种无向图的一些想法
回顾了这几道题之后,写一些总结。HDU 1198(求解 无向图 有几个 连通分量)HDU 1272(判断 无向图 是不是 无环连通图)HDU 1325(判断 有向图 是不是 树)下面是无向图的四种情况:无环连通图有环连通图无环非连通图(每一个连通分量都是无环的)有环非连通图(至少有一个连通分量是有环的)边数 = 点数 - 1边数 > 点数 - 1边数...原创 2019-05-10 02:28:54 · 561 阅读 · 0 评论 -
HDU 1325 Is It A Tree?
传送门这个题是判断是否为树。 树的边是有向的,树也可以为空。 代码里面,s指子结点集,total指结点集,v指边集。 还有一个坑,最后结束标志是负数而不一定-1?#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <unordered_set>using namespac原创 2017-04-08 20:19:18 · 270 阅读 · 0 评论 -
HDU 1879 继续畅通工程
地址已经有些边连通了,用并查集的话就是先把这些边union了(记录conn,不加opt),再把未确定的边排序然后挨个union;用prim的话把这些边权值赋为0。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAXN = 1e2 +原创 2017-04-08 16:27:47 · 336 阅读 · 0 评论 -
HDU 1875 畅通工程再续
地址mst入门题,根据各个点坐标建N*(N-1)/2个边的图。#include <iostream>#include <algorithm>#include <cstring>#include <vector>#include <utility>#include <cmath>using namespace std;const int INF = 1e9;const int MAXC原创 2017-04-08 15:21:03 · 194 阅读 · 0 评论 -
HDU 3371 Connect the Cities
传送门这道题各种奇技淫巧,然而也只是勉强不超时。 题目中的k不是指k个连通的城市,是指k行信息,每行才是连通的城市,而且每行给出的不一定是连通分量。第一种用并查集做,关于连通的城市怎么处理,不能union两点,只能往边表里添加一条权值为0的边,而且要顺着加边(一条链),不能放射状加边。 而且好像不来并查集那两个优化还过不去?(那俩优化表示终于派上用场了)不知道。反正过去了也是九百多ms,没什么意原创 2017-04-08 17:40:07 · 227 阅读 · 0 评论 -
HDU 1598 find the most comfortable road
传送门这题不会,记住写法就行了,好像都是这么写的? 第一次从最小边开始往上添,第二次从第二小边开始。。。每次添边直到那俩点连通,每次记录该次的极差并更新最优值。 可得到的结论是,第i+1次添的最后一条边肯定不会比第i次添的最后一条边权值还小。#include <iostream>#include <algorithm>#include <vector>#include <cstring>原创 2017-04-08 21:46:24 · 222 阅读 · 0 评论 -
HDU 1198 Farm Irrigation
传送门这个题就是考建图,其实想起来以前玩的一个手机游戏就是这种类似铺管道的。 在矩阵里,每个点往4个方向看一下能不能和相邻点接上,但是这样的话要判断重复。更好的想法是往右下两个方向就行了,遍历矩阵按照外层从上到下,内层从左到右。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using na原创 2017-04-08 18:03:40 · 217 阅读 · 0 评论 -
HDU 1272 小希的迷宫
传送门这题主要就是点的数量不确定,另外一个点都没有的话就是YES,而且这题数据里没有有环非连通图,所以直接判断边和点的数量关系即可。#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <unordered_set>using namespace std;unordered_se原创 2017-04-08 20:06:49 · 325 阅读 · 0 评论 -
HDU 3926 Hand in Hand
传送门图同构问题 Graph Isomorphism不过这道题中点的最大度是2,所以图的构型中每个连通分量要么是链(或单个点),要么是单环,所以同等大小的连通分量要区分两种,之后挨个对比就行了。 我一直使用的都是并查集的“根记录个数(负值)版本”。 C++的pair已经写好operator<函数了,按照字典序比较。#include <iostream>#include <algorithm>原创 2017-04-10 15:51:40 · 374 阅读 · 0 评论 -
关于二分限制最短路的题的总结
下面几道题分为两类:最小找最大(还加了一些限制):HDU 2962,HDU 1839最大找最小:CCF CSP 201703 4.地铁修建路上的边权极值相差最小:HDU 1598路上的点权极值相差最小:HDU 2363这几道题都可以用二分限制最短路来求解,但不是都能用并查集来求解。需要输出最短路值(限制情况下),或者对最短路值有个上界,或者有向图,这些情况就都不能用并查集了。(使用并...原创 2019-04-12 21:06:25 · 223 阅读 · 0 评论 -
POJ 1182 食物链
传送门这道题是典型的 带权并查集。思想很巧妙,关键是怎么处理已有的事实来确定当前话的真假,关键是怎么存储已有事实,答案存储是在一颗颗边带权的树里,树是有向边,每条有向边上的权值表示上下结点的关系(也就是这两只动物的关系,到底是一样?还是A吃B?还是B吃A?)。如果当前话的两个动物属于不同的树,那么这句话一定为真的(因为这两个动物无法根据已有事实来链接起来关系)。当前话的两个动物只有属于同一颗树...原创 2019-03-07 20:21:45 · 153 阅读 · 0 评论