二部グラフマッチング、最小頂点カバー--POJ - 1325

トピックリンク

タイトルの意味

二つのそれぞれの機械、N、Mモード、各作業機は、少なくともいくつかの変換モードを尋ねるために、パターンのいずれかに到達するために必要

トピック分析

N二つのマシン、Mモードの二組の二部グラフとして、代表者との間の各作業ライン

タイトルは、(点取るまたはBはであることができる)点の全ての側面をカバーするために必要最小限に抑えることができます

その後定理は、求める最大に一致するように変換することができます

作業は機械モデルは0:00必要とするとき、仕事が変更モードなしで完了することができることに注意してください、あなたが考えることができません

トピックコード

書式#include <stdio.hに> 
する#include <iostreamの> 
書式#include < 文字列の.h>
 使用して 名前空間はstdを、
const  int型 MAXN = 3E4 + 7 構造体の縁{
     INT 次へ。
} E [ 1007 ]。
int型のヘッド[ 107 ]、TOT;
ボイド追加(INT U、INT V){ 
    E [TOT] .TO = V。
    E [TOT] .next = 頭部[U]。
    ヘッド[U]は ++ TOTを= 
} 
BOOL VIS [ 107 ]。
INT bmach [ 107 ]、N、M、K、I、X、Y。
無効INITを(){ 
    TOT = 0 
    memsetの(頭、 - 1はsizeof (ヘッド))。
    memset(bmach、0はsizeof (bmach))。
} 
BOOL(見つけるint型{U)を
     するためのint型!; I = - I =ヘッド[U] 1 ; I = E [I] .next){
         int型、V = E [I] .TO。
        もし(VIS [V])続けます
        VIS [V] = ;
        もし(bmach [V] ||!{(見つけるbmach [V]))
            bmach [V] = U。返す ; 
        } 
    } を返す 
} 
int型のmain(){
     一方(scanf関数(" %のD "、&N)){
         場合(N == 0戻り 0 ; 
        scanf関数(" %dの%のD "、&​​M、およびK); 
        その中に(); 
        int型のmx = 0 ;
        以下のためにint型 i = 1 ; iは= Kを<; iは++ ){
            scanf関数(" %D%D%D "、&​​I、およびX&Y)。
            もし(MX <X)MX = X。
            もし(Xの== 0 || Yの== 0続けます
            (x、y)を加えます。
        } 
        int型の和= 0 以下のためにint型 I = 1 ; I <= MX; iは++ ){ 
            memsetの(VIS、はsizeof (VIS))。
            もし合計++((i)を見つけます。) 
        } 
        のprintf(" %d個の\ n " 、合計)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/helman/p/11290903.html