hdu3360 二分匹配(匈牙利演算法

2022-08-14 08:00:20 字數 947 閱讀 4107

有乙個展廳,裡面有一些文物和守衛,現在守衛不夠,需要再僱傭一些守衛使所有文物被保護,且僱傭數量要最少,求這個數量。

文物被保護的定義:這個文物的所有必須被保護的點都要有守衛。

乙個文物由乙個2的12次方以內的數表示,那麼這個數最多有12位,對應圖中給出打的12個可能要被保護的點。

從末位(i=0 to 11)開始,當i為1,則對應圖中12個點中的第(i+1)個點必須被保護。

構圖:我們遍歷每個文物,求出每個文物的必須被保護的點,向這個點與其對應的文物之間加邊。

顯然,當圖中每條邊至少有乙個點是有守衛的點,那麼此時所有文物都被保護了。這便是求乙個二分圖的最小點覆蓋,也即最大匹配數。

細節:此題用鄰接矩陣可能會超時或爆記憶體。可用鄰接表。

1 #include2 #include3 #include4

using

namespace

std;

5int

n,m;

6int dx[12]= ;

7int dy[12]= ;

8int a[60][60],linker[3600],vis[3600

];9 vector v[2550

];10

bool dfs(int

u)1124}

25}26return

false;27

}28intmain()

2958}59

}60}61

}62}63 memset(linker,-1,sizeof

(linker));

64int u,ret=0;65

for(u=0;u)

6670 printf("

%d. %d\n

",++numcas,ret/2

);71}72

return0;

73 }

二分匹配 匈牙利演算法

這個演算法真心很精妙,其實 很簡單,但是理解其中的奧秘還真要花點時間 matrix67大牛說的好 說穿了,就是你從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配 一條已經匹配過,再下一條又沒匹配這樣交替地出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連...

二分匹配 匈牙利演算法

奆佬的部落格 匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。等等,看得頭大?那麼請看下面的版本 通過數代人的努力,你終於趕...

HDU 1151 二分匹配 匈牙利演算法

二分匹配 匈牙利演算法 根據 dag圖的最小路徑覆蓋數 節點數 n 最大匹配數 m 先用匈牙利演算法求出最大匹配數,再用它減去節點數就可以了 include includeusing namespace std const int n 125 int map n n vis1 n vis2 n fl...