
并查集
QD演绎阿
这个作者很懒,什么都没留下…
展开
-
Jumping Monkey
特殊并查集:按点权从小到大枚举结点 u ,并将 u作为所有与u相连的(已经枚举过的)连通块的根。从而建立一棵新树,每个结点的深度(根的深度为1)即是答案。code:#include <iostream>#include <vector>#include <algorithm>using namespace std ;const int N = 1e5+10 ;bool vis[N] ;int T , n;int p[N];vector<int.原创 2021-10-11 12:13:52 · 116 阅读 · 0 评论 -
HDU 7123 City
题意:给出一个带权非联通图,图中有若干联通分量,图中的点代表城市,有一些城市可以互相到达。试去掉边权小于x的所有边,试问去掉这些边后,还有多少对城市可以互相到达?并查集+离散化思路:可以先对每个连通分量进行预处理,即保留权值尽可能大的边使得连通分量保持原有连通性,对于连通分量中一些无用(权值较小)的边直接删除。优化连通分量的具体操作是对按照权值进行排序,优先选用权值较大的边,这样总能生成一颗更健壮的树。建树的同时记录每种权值的边所能连接的点对数,这样破坏某些边时就能快速获取这些边能影响的点对数。最后.原创 2021-09-05 12:59:05 · 139 阅读 · 0 评论 -
D - Forest
题意:给出一个由n个点m条边构成的森林,每个点有个权值val[i],额外加一条边(u,v)的花费是val[u] + val[v],且u、v只能被用到一次,添加一些边使得图连通,求最小花费。思路:先找连通块的个数x,那么需要(x-1)条边使这些块连通,因为不能重复选点,所以需要2(x-1)个点使其连通,要生成一棵树,则至少要有2(x-1)个点。先在每个连通块中找一个最小点,这样一共找了x个点,再从剩余(n-x)个点中找 [2(x-1) - x] 个最小点。对这2(x-1)个点的权求和。特判一开始就是一棵树.原创 2021-08-15 17:12:05 · 120 阅读 · 0 评论 -
D - Sum of Maximum Weights
思路:①把所有点合并为一颗树的过程:任选两个点集做合并,对两个点集中的点做笛卡尔积形成若干新的点对。最后生成的点对个数也是组合枚举的全集,这点毋庸置疑。②按边权升序,每次合并两个点集,都以最大边作为连接条件,这也是这条边能发挥的最大效益。code:#include <bits/stdc++.h>#define int long longusing namespace std;struct Node { int x, y, w; bool operator&l.原创 2021-08-15 10:08:57 · 198 阅读 · 2 评论