五下暑假/六上笔记
_Glassy_Sky_ · · 个人记录
五下暑假部分
普及B组2班
2023-7-12比赛题解
2023-7-12比赛题解(温暖版)
团队题单
六上部分
1、并查集
主体代码(初版):
int find(int i)
{
while(i != NULL)
i = fa[i];
return i;
}
但是这样如果遇上一左一右这么摆下来的二叉树,那么时间复杂度则会非常巨大。于是我们的输入可以进行调整,由cin >> a >> b; fa[b] = a改变成cin >> a >> b; if(find(a) != find(b)) fa[find(b)] = find(a)
此代码就是union(合并)
因为如果当输入要将两个点连起来时,如果直接连,程序会显得异常杂乱,我们便可以将两个节点的父节点给连接起来,会更加简便。
我们还可以将之前的函数进行改进:
int find(int i)
{
return i == fa[i] ? i : fa[i] = find(fa[i]);
}
同样是刚才那个原理,我们在寻找一个结点的最终父节点时,不用先找到它的父节点,而是直接把它赋值为它父节点的最终父节点,最后加一个特判,如果它的父节点就是自己,则直接返回自己的值。
题目一般本质上就是求两个节点是不是拥有同样的父节点,用上这一句就可以了:
if(find(u) == find(v))