NEFU大一暑假集训-并查集
- OP
- A 食物链
* - B 关押罪犯
* - C 程序自动分析
* - D 最小生成树
* - E Lomsat gelral
* - F 修复公路
* - G 奶酪
* - I City
* - J The Child and Zoo
* - ED
OP
感谢ph和zsl两位大佬的指导与讨论;
A 食物链
思路
查看PDF即可~
两种做法,下面代码中选择了扩展域;
代码
1 |
|
B 关押罪犯
思路
详见PDF~;
贪心,优先分配矛盾最严重的,直到无法分配;
代码
1 |
|
C 程序自动分析
思路
详见PDF~;
先把要求相同的放在同一集合中,再查看要求不同的是否有冲突;
代码
1 |
|
D 最小生成树
思路
最小生成树板题~
这里是直接用天空之城代码改的;
代码
1 |
|
E Lomsat gelral
按秩合并思想
题目大意
给出树状结构和每个节点的颜色编号,输出以每个节点为根的子树出现次数最多的若干颜色编号之和;
思路
在dfs搜索时,对某节点下每个子树的颜色需要单独维护,如果对每一子树都重复进行维护和撤销,显然在处理以该节点为根的子树时又需要把这些子树再维护;
我们可以保留权重最大的子树,最后处理,处理后再维护其他子树的值,直接作为以该节点为根的整个子树的颜色统计;
对于颜色统计,我们可以用桶来维护,在搜索最大颜色时不必扫描整个桶数组,以子树的根节点进行dfs即可;
代码
1 |
|
F 修复公路
思路
最小生成树~
只不过这里求的是生成树中最大边权;
同样改自天空之城;
代码
1 |
|
G 奶酪
思路
这里用的是BFS;
代码
1 |
|
I City
题目大意
给出城市,道路和道路强度,求问在不同强度的攻击下,有多少城市对之间仍有通路;
思路
显然,若对于每一次攻击重新进行搜索是不实际的;
由于高强度攻击下剩余的道路一定是低强度攻击下剩余道路的子集,所以我们可以从高到低处理询问,逐步添加道路;
代码
1 |
|
J The Child and Zoo
“最大生成树”
题目大意
给定每一个节点的权重和网状结构,定义为 i 到 j 的所有简单路径中,途径节点最小值的最大值;
求
思路
对于每条道路,道路的权值即可认为是道路两端节点权值的最小值;
从大到小排列所有道路,生成“最大生成树”,对于每次连接操作,即可认为道路一段所在区块与另一端所在区块的元素两两之间的 f 值均为此道路的权值;
代码
代码依然修改自天空之城;
1 |
|
ED
\
NEFU大一暑假集训-并查集
https://tanyuu.github.io/2021.07-12/NEFU大一暑假集训-并查集(ABCDEFGIJ)/