詳細互いに素セットユーモアを理解しやすい(+回転変化します)

チェックとセットの原理を説明するために、私は興味深い例を提供します。

 政界の言葉上の英雄のすべての種類が散らばって、何千もあります。彼らは何の適切なジョブは、外ではなく、人々が会う道であり、自らの剣を運ぶ一日中歩き回っ、それは必然的な戦いではありません。しかし、ヒーローが優位に義務の感覚を持って、絶対に彼の友人と戦うためにではありません。そして、彼らは信じている、私たちの一つであると考えているどのように多くのターンのターンに関係なく、シリーズの友人を通じて関係、限り、「友人の友人は、私の友人ではありません」。その結果、1人のギャングの形成に川や湖は、2つずつの間に友情で一緒にリンク。しかし、ではない、あなたが死んで再生するために安心することができますので、どのような場合には、友情で一緒に置くことができない、同じギャングインチ しかし、2つの元の人々はそれが友人のサークルに属しているかどうかを確認する方法、お互いを知っていますか?

私たちは、サークルの代表として、友人の各サークルでは比較的名門人を選ぶことができます。このように、各円はように長い間彼らの船長に対して互いに2が同一人物ではないとして、あなたは敵と味方との間の関係を決定することができます......「中国同胞団」仲間のアメリカのチーム」と命名することができます。

しかし、問題は、ああ、唯一の自分の直接の友人を知っている英雄は、多くの人々は単に彼らの指導者が誰であるかを決定するためにキャプテンを知らないとだけあてもなく友人関係の友人を通じて依頼するつもりはできるということですがあります:「あなたはないキャプテン?あなたはキャプテンではない?「そう、戦いは最初に餓死している空腹、数十年を依頼する必要がありますしたい、私は我慢できません。結果として、顔の船長はまただけでなく、恥ずかしい非効率的であるだけでなく、無限ループに陥ることができます。その後、船長は再グループ化を命じました。チーム内の誰もが、階層的なシステムを実装するツリー構造を形成するために、私は、ルートノードのキャプテン、次は2人の選手、3人の選手がされました。ただ、誰もが自分の上司に来るという行であることを覚えています。限りの層が最高レベルまで尋ねたとして、友人と遭遇した敵を判断すると、短時間でキャプテンが誰であるかを判断することができます。我々は唯一のそれは彼らが友情によってどのように関連しているかのように、ギャングの二人の間にある、とするかどうかを気にしているので、それぞれの円の内部構造はどのようにでも船長人、重要ではありません。だから我々は再び敵と味方との関係が十分に間違っていない限り、チームをキャプテン自由に楽しむことができます。このように、武道は生産しました。

ここでは、見て、実現のセットを確認してください。INTプレ[1000];この配列、誰の各はいヒーローは、優れた記録しました。1つのまたは0の開始番号からヒーロー(質問の意味に従ってもよい)、予め[15] = 3 15人のヒーローの上司が3人の英雄であることを述べています。男は自分の上司である場合、それは彼が頭であることを示しており、これまでに発見します。別の派閥の一匹狼は、彼が自分の上司である、など欧陽鋒などもあります。誰もが唯一の彼の上司を認識しました。例えば、胡Qingniuの学生は、彼らが左ヤンに報告することを知っています。誰張無忌こと?私は知りません!彼らの頭は一つだけレベルチェックアップが誰であるかを知るために。 
findrこの機能は、十分に明確な意味、頭を見つけるために使用されます

 

int型 findr(int型ルート)// SUPREMOを探す
{
     int型の息子、TMPを、
    息子 = ルート、
     しばらく(!ルート=事前に[ルート])// 上司の頭ではない 
        =ルート[ルート]を事前に、
     しばらく(息子!ルート=)// ヘッドが表示されるまで、私は、彼の上司を見つけるでしょう
    { 
        TMP = 前[息子]; 
        [息子]前 = ルート; 
        息子 = TMP; 
    } 
    戻りルート; // 駆動するヘッド~~ 
}

 

それは、二点間の偶数ラインではありません、彼らが交換できる上、前の二つのプレートのすべてのポイントとなるよう、の機能を団結見てみましょう。これは、マップ上で行うライン上に線を描画するために良いことです。しかし、今、我々は互いに素セット武道の状況、唯一の事前[]配列の合計を記述するために使用され、どのようにそれを達成するには?たとえば、湖はまたは、武道に今、図に示されている状況を仮定します。徐朱ハンサムポットと周Zhiruo MMは私のお気に入りの2つの文字で、彼らの究極のボスはXuanciの修道院長と修道女キラーであり、明らかに二つの陣営います。私は彼らがお互いを戦うためにしたくない、右側に彼らは言った:「お二人は、ララ、良い友達をフック」彼らは私の顔に見える、私は同意しました。この同意は戦うことができない無些細な問題で、全体の少林寺と峨眉山月。それはどのように多くの場所を変更することができますどのようにこのような大きな変化?実際には、非常に単純な、私はマスター」:. Xuanciの修道院長に言った、あなたの上司が絶滅にShitaiそれをこのように変え置くことができ、すべての関係者の元の究極のボスの2つの派閥もボールを打つShitai、あります!。ああ内部武道「確かによくやっXuanciの1:」、我々は唯一の接続の構造を気に、とにかく問題ではありません、私が頼りに、私は「私の抗議をオンにする方法ではなく、それが何であるかを彼女の手になりました?!このように、二人は戦争を満たすため、色はああ、しかし、ああ、最終的にこの戦争の結果があるだろう状況を殺すために非常に困難で、勝者がすべて取ります。弱いが併合されました。とにかく、誰が誰な効果に参加したことは、2になるための武術と同じです。この関数は、それを理解するためのものですか?

 

無効 umite(int型 ROOT1、int型 root2)// 徐朱と周Zhiruoの友人
{
     int型のX、Y、
    X = unionsearch(ROOT1); // 私の上司はXuanciである 
    Y = unionsearch(root2); // 私の上司は絶滅
    IF(!= X- Y-)
        事前に[X-]は y軸=; // 戦い、ここで勝った相手の上司は、同じ、事前に[Y]のとき勝つ= XいただいてもOKです 
}

 

関係が長すぎると感じる場合は、結果として、効率が大幅に削減されます

 

 このシナリオを想像してみて:二つの見知らぬ人は英雄を満たし、かつ知りたいことができません。その後、すぐに上司に尋ねるために呼び出さ:「?あなたは頭ではありません」優れたが、彼は言った:.依頼するすべての方法ダウン「私はそのようにはないよ、そうやので、私の上司誰であるか、あなたはを見て彼に尋ねる」、2つの最終ボスを持っていました彼らはDongchang Caogongゴングです。「おっと、それは丁寧で礼儀正しい、私たちの1、3つの大隊小麦粉ひょうたん人形の次の6つのグループにあることが判明!」「はじめまして、9つの大隊18妖精犬の尻尾の花の次のセットを!」彼らは喜んで手をつないで行くために飲みますA。「などなど、2人の英雄が滞在してください、まだ終わっていないものがあります!」彼らは私を停止しました。「ああ、はい、私たちはパス圧縮を行う必要があります。」彼らが目を覚まします。6人のリーダー上司と呼ばれる小麦粉のひょうたん人形:「リーダーああ、私たちは、Caogong功宣誓男性で一緒にクラッシュし、レベルが低すぎる未来を救うためにとして、実際には、クラッシュCaogong功の頭が良くない、確認しました。頭のトラブルを検索します。「」まあ、それは理にかなっています。「小麦粉ひょうたん人形が、その後わずか3人の大隊の司令官を訪ね電話をかけ......妖精の尻尾の花の犬が同じことをしました。このように、クエリに関連するすべての文字がCaogong功の直接のリーダーシップの下で収集されます。すべてのクエリ処理が最適化されているので、武術層のツリー全体を比較的低いレベルに維持されます。パス圧縮コードは、自分自身のアナログ一見、ごく単純な再帰を読み取ることができない、うまく読み取ることができます。要するに、それは機能は、そのような意味で実装しています。

その結果、より速く、それの頭を見つけることができません

もちろん、コードも簡単になることができます

xのヘッドfindrクエリ機能

 

INT findr(INT X)// ヘッドを見つける
{
     IF(PAR [X] == X)// 見つけ、頭部出射
        戻りX;
     
        戻り PAR [X] = findr(PAR [Xを]); // 私の頭は優れていません 
}

 

機能を団結変更するように変更する必要があり

 

void unite(int x,int y)//x和y想打架
{
    x=findr(x);//我老大是x
    y=findr(y);//我老大是y
    if(x==y)//我们老大相同,不打了
        return;
    par[y]=x;//老大不同,打一架,y或x谁当老大都行,反正最后是合并 y并入x或x并入y都行
    sum[x]+=sum[y];//y并入x,则x的小兵个数等于x的小兵个数+y的小兵个数
}

 

OK 你已经学会如何处理帮派之间的纷争了(并查集)  恭喜出师 

可以试试这题https://www.cnblogs.com/sky-stars/p/11222823.html

点个关注呗

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/11222999.html