【二部グラフ予備] [テンプレート]二部グラフ・マッチング

トピックリンク

説明タイトル:二部グラフボードです。

Q:それは二部グラフとは何ですか?

A:全く二部グラフは有向グラフではない各エッジの端点が異なるサブセットに属している2つのサブセットに分割することができ、この図を満たすこと。

それは何を意味するのでしょうか?上記は、実際には、これはよく人生によって説明することができる、あいまいなように見えるかもしれません。実生活では、各クラスには、男性と女性の「異常な関係」のように、いくつかあります。私たちは、同性の誰一組(笑)がない見つけた場合、我々は、すべての年間を通じて、そのような人が出て、一緒に立って引っ張ってくる、そして学生の子犬の愛(同性愛者に対するI差別が)公衆の道徳のグループと一直線にされていないものは、我々はそれを言うことができますグループは、二部グラフの定義と一致しています。これは、それらの間のすべての図の感情の等価は、それらの異なる性別異なるサブセット、2つの互いに素なサブセット(すぎる両性草)の端部に接続され、各側に接続されています。 (場合にはゲイの友人が存在する場合)、エンドポイントは同じサブセットではありません。

二部グラフの定義を理解した後で、二部グラフは、面白いことが起こるのだろうということ?我々はまだ上記のモデルに依存しています。まず、単語の定義:マッチングは、エッジの係合と前記添付のその2つの点を参照することができます。このモデルでは、意味のカップルの同等。あなただけの多くのカップルがあるかもしれない年のように、試合の多くを持つことができるマップが同じ(ない子犬の愛!)、そして、ばらばらの性質を満たすためにマッチしたフィギュア、最大マッチングと呼ばれるマッチングの最大数です。この解釈は、夫婦が引き出す必要があった後、私たちはいくつかのスラグオス/メスを見つけるだろう、また非常に簡単です、そして、彼らは恋に落ちた二つ以上の(あまり草)、我々は嫉妬から抜け出す今回、これらの要件を有することができます人々はすぐに試合になるために、人生の選択肢、つまり、相互関係の確立のために決定を下します。人生は三角関係が許可されていないがあるので互いに素マッチが決定されます。

したがって、これらの学生は幸せになるようにするために(子犬の愛は幸せではない!)、私たちは最大のサブセットを見つける必要があります。どのようにそれを行うには?ハンガリーのアルゴリズム - 今回は、アルゴリズムを使用する必要があります。

パスを増強:私たちは、定義を紹介します。しかし、非常に複雑な(興味を持って自分の調査)に、私は感情的な解釈を行います。まず、タグのいくつかを持っている:誰かとの関係を決定し、誰かが交流の過程にある場合。少年たちによって、以下の説明では、彼が検索し、検索、まず、少年のために、彼が開始することを選んだ、ある女の子(およびその逆)を選択し、その後、遭遇した2つの状況があります:1は探し2.女の子は選択しない選択しました。1、我々は自分の幸せのためにいくつかの機会を戦うので、他の誰かが彼氏のために、以下の要求を試してみましょうする必要があり、その後、仲間の男性を依頼する時は、あなたが見つけることができますか?(この時点で、女の子が交流の過程にあったので、仲間の男性が彼女を見つけることができません)私たちはこの1つを勝つためにとても幸せ、(関数の戻り値)を変更できるかどうか、そして、あなたと私(あまりにも草を横切ります)関係は(そこに、いずれかのI他人も人に答えを与える可能性があるため)(ブックレット、名前を変更?)を確認した後、1を返し、他の人を見つけるためにのみ変更することはできません。2直接選挙だけで罰金(結局、まだ引っ張ります)。

そして、アルゴリズム部分は、オーバーに注意するポイントです。この機能は、自分自身を呼び出されていないが、主な機能は、(それが他の誰かが私を変えてみましょう、ではありませんが、私が探しています)を呼び出すときに、タグの配列をクリアしてください!(すなわち、交換プロセス内のフラグかどうか)、そしてこのタグは、リスト上で選択された唯一のタグです。(その後、この配列の役割はそれは男の子が混乱して見てみましょうですなぜ人々は変化を待っているので、アンタッチャブルである彼が指摘し、依頼します)

コード

#include <iostreamの> 
する#include <cstdioを> 
する#include <fstreamの> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <CStringの>
 使用して 名前空間STD。
int型読み取り(){
     チャーCH。
    INTのRES = 0、F = 1 
    CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 ' ){
         場合(CH == ' - ')、F = - 1 
        CH= GETCHAR()。
    } 
    一方、(CH> = ' 0 ' && CH <= ' 9 ' ){ 
        RESの =のRES * 10 +(CH- ' 0 ' )。
        CH = GETCHAR()。
    } 
    戻り RES * F。
} 
CONST  INT MAXN = 20005 INTのN、M、E、U、V、ANS。
BOOL is_to [MAXN] [MAXN]、VIS [MAXN]。
INTをL [MAXN]、R [MAXN]。
BOOL DFS(INT X){
     ためINTI = 1 ; I <= M; ++ I){
         場合(VIS [I] &&!is_to [X] [I]){ 
            VIS [I] = 1 もし(!R [I] || DFS(R [I])){ 
                R [I] =のX。
                L [X] = I。
                リターン 1 ; 
            } 
        } 
    } 
    戻り 0 
} 
INT (){メイン
    N =(読み取り); M =読み取る(); E = 読み取ります()。
    以下のためにint型 = Iを1 ; iは= Eを<; ++ I){ 
        U= read()は、V = 読み取ります()。
        もし(U <= N && V <= M)is_to [U] [V] = 1 
    } 
    のためにint型 i = 1 ; iが<= N; I ++)場合(!{L [i]が)
        のmemset(VIS、0はsizeof (VIS))。
        ANS + = DFS(I)。
    } 
    COUT << ANS。
    リターン 0 ; 
}
コードの表示

ハンガリーDFSアルゴリズムは、その一部です。

 

おすすめ

転載: www.cnblogs.com/clockwhite/p/11564465.html