いくつかの方法で問題を解決するためのLCA

いくつかの方法で問題を解決するためのLCA

このエッセイは、グラフ理論LCA(共通の祖先)いくつかの解決方法や実装に問題を説明します。LCAは、グラフ理論の高度な問題となっているので、私は読者は、主グラフ理論描画の基本のいくつかを知っていて、深い検索アルゴリズムの実装を知って学ぶことを願っています。だから、このブログは快適で、速く理解するだろう。

知的準備

LCAは、問題を理解するノードの深さは非常に重要であることを理解、我々は木を描くことができます。ツリーでは、すべてのノードが深さを持っています。1がルートノードの深さであり、他のノードは、それを処理するためにツリーを深い検索の深さを使用することができます。このように、我々は、配列の深さによって問題を解決するためにLCAアルゴリズムを達成することができるようになります。

LCA単純なアルゴリズム

LCA単純なアルゴリズムの実装プロセスには約このです:問い合わせの二点について\(X軸、Y軸の\) 最初の2点は、その親、持ち上げステップバイステップに沿って、より深い人、そしてより深いポイントを決定し、までと\(Y \)深度点は同じです。向上しながら\(X、Yの\) これは、単一の時点になるまで2点、2点、その後ポイントは、我々はLCAを要求されることです。

このアルゴリズムの特性によると、私たちは、アルゴリズム「登山を登る」彼に電話します。このアルゴリズムを理解することは非常に簡単ですが、非常に応答しません。だから我々は、コードを与えることはありません。

LCAの乗算アルゴリズム

LCA単純なアルゴリズムだけで理解しやすいが、非常に反応しなく言及しました。倍増LCA:だから我々はもう少し高度な方法を開始しました。アイデアを倍増することは、最適化アルゴリズムの使用の多くのインスタンスがあり、実際には、最適化のアイデアを使用することは非常に簡単です。乗算後のブルートフォースアプローチRMQを用いて、このような問題は、このような乗算は、LCAの乗算アルゴリズムになった後、最適化クライミングLCAクライミングアルゴリズムとして、テーブルST(STアルゴリズム)を最適化するようになります。

いわゆる乗数LCAは、実際には、十分に理解、登りで、我々は今、クロールなる単純なアルゴリズムのオリジナルです\(2 ^ k個\)が大きく複雑に最適化されたでしょうか月間、。

手順を達成し、変化がない:、後に一緒に登って最初の小さな登りです。しかし、今回は2次元配列Fに対処します。\([X] [K F \]) を表し\(x \)最初の\(2 ^ k個の\)生成祖先はいあります。したがって、我々は、再帰式に来ることができる:
\ [F [X] [K] = F [F [X] [-K 1] [-K 1] \。]
これはよく理解されるべきである:(\ X \)\(2 ^ K \)に等しい発生祖先\(X \)\(2 ^ {K-1 } \) の祖先生成\(2 ^ {K-1 } \ 祖先の世代。

(実際には、これは動的計画法です)

残りはただの詳細です。LCAは尋ねた質問に応じた際に多くの注目は、テンプレートを変更するには、後で質問をしてください。

コード:

int lca(int x,int y)
{
    int ret;
    if(deep[x]>deep[y])
        swap(x,y);
    for(int i=20;i>=0;i--)
        if(deep[f[y][i]]>=deep[x])
            y=f[y][i];
    if(x==y)
        return y;
    for(int i=20;i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
        else
            ret=f[x][i];
    }
    return ret;
}

おすすめ

転載: www.cnblogs.com/fusiwei/p/11494132.html
おすすめ