クラスカルツリーの再構築の概要

役割:クラスカルによって、我々は、2つの点間の最大エッジ重み介して最小値を見つけることができる番号(すなわち、ボトルネック道路)です。
点が右である場合、右側が2点の最大値に設定されています。
計算された最小スパニングツリーをした後、この値はパスで最も価値があります。

しかし、時には、これは十分ではありません。
我々は、成果ができる:X、Y、新しい点U、右端の右の値、及びXを接続、Yは親ルートノードである属するはUに設定されています。
では、このプロセスを維持するために、互いに素セット。

したがって、それは二分木を得ることが可能である、クラスカルは、再構成されたツリーと呼ばれます。
この場合には、Yに対するX値ツリーX、LCAの右側のY点です。
同時に、我々はxからの逸脱を掛けることができ、Yはもはや右側(点)より、点間隔として表されるサブツリーとして表される達することができません。

コード:

int getv(int x)
{
    if(f[x]==x)
        return x;
    f[x]=getv(f[x]);
    return f[x];
}
int gettree1(int n,int m,vector<int> ve[400010])
{
    for(int i=0;i<n;i++)
        f[i]=i;
    for(int i=0;i<m;i++)
    {
        px[i].x=x[i];px[i].y=y[i];
        px[i].z=max(x[i],y[i]);
    }
    qsort(px,m,sizeof(SPx),cmp1);
    for(int i=0,j=n;i<m;i++)
    {
        int tx=getv(px[i].x),ty=getv(px[i].y);
        if(tx==ty)
            continue;
        f[tx]=f[ty]=j;f1[tx]=f1[ty]=j;
        f[j]=j;z1[j]=px[i].z;
        ve[j].push_back(tx);
        ve[j++].push_back(ty);
    }
    return getv(0);
}

おすすめ

転載: www.cnblogs.com/lnzwz/p/11666652.html