ボード(ハンガリーのアルゴリズム、隣接行列)
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 。 }