二部グラフマッチングエントリのタイトル

ボード(ハンガリーのアルゴリズム、隣接行列)

const  int型 MAXN = 2E3 + 5 int型UN、VNを。
INT G [MAXN] [MAXN]。
int型のリンカ[MAXN]。
BOOL [MAXN]使用。

BOOL DFS(INT U)
{ 
    ためのint型 V = 0 ; V <VN; V ++ 場合(Gは、[U]は[V] &&!使用は[V])
        { 
            使用は[V] = もし(リンカー[V] == - 1つの || DFS(リンカー[V]))
            { 
                リンカー[V] = U。
                返す ; 
            } 
        } 
    を返す 
} 

INT ハンガリー()
{ 
    int型 RES = 0 
    memset(リンカー - 1はsizeof (リンカー))。
    INT U = 0 ; uは国連<; U ++ 
    { 
        memsetの(使用、0はsizeof (使用されます))。
        もし(DFS(U))RES ++ ; 
    } 
    戻りRESと、
}
コードの表示

 

HDU 1045

問題の意味:図は、条件要塞は、条件を満たすためにアップ配置しようとしている、「X」与えられたスペースおよびセパレータを与える「」:いない場合は、パーティションで区切られ、家は唯一の垂直方向と水平方向に配置することができます、セパレータは、次に、(相対位置)のパーティションの後に考慮されていません。

溶液:別々に、各行及び各列に対しては、(再ラベル)点に小さくしても両者の交点(実際には、二つの条件リンク(行、列)へ一緒に)場合

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、 
#define(iは、、B)は、(i ++は; iが(b)の<I =(A)INT)ため_for
 の#define(iは、b)のための式(I =(A)がINT _repと、iが=(< b)は、iは++)のconst int型 MAXN = 2E2 + 5 int型UN、VNを。
INT G [MAXN] [MAXN]。
int型のリンカ[MAXN]。
BOOL [MAXN]使用。BOOL DFSは(int型U)を
{ ためint型 V = 0 ; V <VN; V ++ 場合(G [U]は[V] &&![V]使用)
        { 
            使用[V] = 

 


    ;
            もし(リンカー[V] == - 1つの || DFS(リンカー[V]))
            { 
                リンカー[V] = U。
                返す ; 
            } 
        } 
    を返す 
} 

INT ハンガリー()
{ 
    int型 RES = 0 
    memset(リンカー - 1はsizeof (リンカー))。
    INT U = 0 ; uは国連<; U ++ 
    { 
        memsetの(使用、0はsizeof(中古));
        もし(DFS(U))RES ++ ; 
    } 
    戻りRESと、
} 

チャーマップ[MAXN] [MAXN]。
INT MROW [MAXN] [MAXN]、Mcol [MAXN] [MAXN]。

INT メイン()
{ 
    IOS :: sync_with_stdio(0)。cin.tie(0)。cout.tie(0 )。
    // freopenは( "in.txt"、 "R"、STDIN)。    
    int型のn;
    一方、(CIN >> N、N)
    { 
        _for(I、0、N)(J、_for 0、n)がCIN >> マップ[I] [J]。
        uN = VN = 0 int型のcu = 0、CV = 0 ; 
        memset(MROW、 - 1はsizeof (MROW))。
        memset(Mcol、 - 1はsizeof (Mcol))。
        (I、_for 0(J、_for、n)は0 、N)
        { 
            場合( - MROW [I] [J] == 1つの &&マップ[I] [J] == ' ' 
            { ためのint型 K = J、K <N &&マップ[i]が[K] == ' ' ; kは++ 
                    MROW [I] [K] =
                銅;
                uN =最大(UN、++ 立方); 
            } 
            もし(Mcol [I] [J] == - 1つの &&マップ[I] [J] == ' ' 
            { ためのint型 K = I、K <N &&マップ[K] [J] == ' ' ; ++ k個
                    Mcol [k]が[j]が = CV。
                VN = MAX(VN、++ CV)。
            }     
        } 
        のmemset(G、0はsizeof (G))。
        _for(I、0、N)(J、_for 0 、n)の
             場合
                (マップ[I] [J] == ' ')G [MROW [I] [J] [Mcol [I] [J] = 1 
        COUT <<ハンガリー()<< ENDL。
    } 戻り0 
}
     
コードの表示

 

おすすめ

転載: www.cnblogs.com/Yokel062/p/11330059.html