是否路径压缩的差别真大!

P3367 【模板】并查集

史强 @ 2020-01-10 10:33:51

最近一直在练习并查集

p.s.:各位大佬能推荐点题目么?

但是

是否路径压缩的差别真的大!

压缩前:

#include <bits/stdc++.h>
using namespace std;

struct unionfind
{
    int bin[10005];

    unionfind()
    {
        for(int i=1;i<=10002;i++)
        {
            bin[i]=i;
        }
    }

    int anc(int x)
    {
        if(bin[x]==x)
        return x;
        else
        return anc(bin[x]);
    }//return anc(bin[x]);

    void uni(int x,int y)
    {
        bin[anc(x)]=anc(y);
    }
    void ask(int x,int y)
    {
        if(anc(x)==anc(y))
        {
            cout<<"Y"<<endl;
        }
        else
        {
            cout<<"N"<<endl;
        }
    }
};

unionfind u;

int main(void)
{
    int n,m;
    int z,x,y;
    cin>>n>>m;
    while(m--)
    {
        cin>>z>>x>>y;
        if(z==1)u.uni(x,y);
        else
        if(z==2)u.ask(x,y);
    }
    return 0;
}

码风与众不同

结果:点我

震惊:与ta一样

于是改了一下

(代码在此不展示,各位大佬应该明白)

评测结果:点我

是否路径压缩的差别真的大!


by ieeqwq @ 2020-01-10 11:30:48

α很小


by Kubic @ 2020-01-10 11:31:02

但是并查集常数极小,而且也没有人会无聊到卡路径压缩的并查集


by EndSaH @ 2020-01-10 12:44:13

有卡的数据构造方法啊,洛咕日报有一期介绍了


by LZDQ @ 2020-01-10 12:45:18

路径压缩的并查集卡不了吧


by 茅场晶彦 @ 2020-01-10 12:46:47

为啥卡不了啊


by yurzhang @ 2020-01-10 12:52:01

没有优化的并查集是 O(n^2) 的,单路径压缩或单按秩合并的复杂度是 O(n\log n) 的,两个优化同时加上是 O(n\alpha(n)) 的,证明见算导。


by QuartZ_Z @ 2020-01-10 12:53:19

@森岛帆高 因为路径压缩log的常数较小,运行时间拉不开差距。


by 142857cs @ 2020-01-10 14:17:05

@QuartZ_Z 不算很小吧?常数是1。不过很少有人去卡O(nlogn)的时间复杂度,那样会卡在读入上


by zhy137036 @ 2020-01-10 16:22:14

@yurzhang 在算导哪一章哪一节?


by yurzhang @ 2020-01-10 16:43:49

@zhy123456 您不会看目录吗?

第 21 章第 4 节


上一页 | 下一页