二部グラフマッチング問題点の最小被覆セット

// いくつかの簡単なアイデア部グラフ
 // 最小カバレッジポイント部グラフ:そのすべての側面を覆うエンドポイントに選択された点と同等と仮定
 // 最小二部グラフカバー組(XとYの組の集合を選択された最小点は、図面のすべてのエッジを覆われている)であってもよい
 // 最小被覆セットポイント数==二部グラフの最大マッチング
 @ 結論:https://www.cnblogs.com/jianglangcaijin/p/6035945 .htmlの(ORZ)
 // 例HDU 2119(ボード) 
の#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの>
 使用して 名前空間STD;
 のconst  int型 MAXN = 100 + 15 ;
 BOOLグレープ[MAXN] [MAXN]; / / アイデア:水平および垂直軸は、二部グラフを確立する場合グレープ[I] [jを ] == trueを、 次いでIJを証明の間にエッジが存在する、最小のカバレッジポイント設定問題に変換される
int型のN-、M。
BOOL VIS [MAXN]。
int型の一致[MAXN]。
BOOLハンガリー(INT U)// 寻找增广路
{
     ためのint型 V = 1 ; V <= M; ++ V)
    { 
        場合(VIS [V] &&!グレープ[U] [V])
        { 
            VIS [V ] = もし(一致[V] == - 1 || ハンガリー(一致[V]))
            { 
                一致[V] = U。
                返す ; 
            } 
        } 
    }
    返す ; 
} 
INT ()解決
{ 
    memsetの(一致、 - 1はsizeof (一致します))。
    int型 CNT = 0 ;
    INT U = 1 ; U <= N; ++ U)
    { 
        memsetの(VIS、はsizeof (VIS))。
        もし(ハンガリー(U))
             ++ cntを。
    } 
    戻りCNT。
} 
int型のmain()
{ 
    一方(CIN >> N && N)
    { 
        CIN>> M。
        以下のためにint型 I = 1 ++; iが<= N I)
             のためにINT J = 1 ; J <= M; ++ j)は
                、CIN >> グレープ[I] [J]。
        COUT <<(解決)<< ENDL。
    } 
}

//識別が完了すると、私はゴミでした

おすすめ

転載: www.cnblogs.com/newstartCY/p/11569489.html