昨天,主要学习了并查集,按路径压缩和按秩合并去进行优化,并查集主要是在一个大集合里面找出一个最顶的代表节点,这个节点就可以代表这整个集合。并查集一般维护具有传递性的关系及其连通性。所以我们可以使用扩展域和边带权的并查集来解决。
int find(int x)
{
if(x!=pre[x])
{
int temp=find(pre[x]);
pre[x]=temp;
}//直接一个递归式子搞定 return x==pre[x]?x:pre[x]=find(pre[x]);
return pre[x];
}
void join(int x,int y)
{
int a=find(x);
int b=find(y);
if(a!=b)
{
pre[a]=b; //看题目的要求,看看是谁并谁
}
}
对于并查集,我看了两种类型的题,一种是裸板题像畅通工程,还有一种是边带权的并查集,像像食物链那种题。书上的题目大致都看了一遍。然后,大概地又看了树状数组这一节,树状数组主要支持前缀和查询和单点增加这两个功能。
今天再看一下树状数组和逆序对以及树状数组的应用等问题,再接着往下学。多看书,多看题。