图论,匈牙利算法
匈牙利算法
?USACO 4.2.2 The Perfect Stall 完美的牛欄這是一種用增廣路求二分圖最大匹配的算法。它由匈牙利數學家Edmonds于1965年提出,因而得名。 定義 未蓋點:設Vi是圖G的一個頂點,如果Vi 不與任意一條屬于匹配M的邊相關聯,就稱Vi 是一個未蓋點。
交錯路:設P是圖G的一條路,如果P的任意兩條相鄰的邊一定是一條屬于M而另一條不屬于M,就稱P是一條交錯路。
可增廣路:兩個端點都是未蓋點的交錯路叫做可增廣路。?
流程圖
偽代碼:
bool 尋找從k出發的對應項出的可增廣路 {while (從鄰接表中列舉k能關聯到頂點j){if (j不在增廣路上){把j加入增廣路;if (j是未蓋點 或者 從j的對應項出發有可增廣路){修改j的對應項為k;則從k的對應項出有可增廣路,返回true;}}}則從k的對應項出沒有可增廣路,返回false; }void 匈牙利hungary() {for i->1 to n{if (則從i的對應項出有可增廣路)匹配數++;}輸出 匹配數; }演示
C實現
#include <stdio.h> #include <string.h> #define MAX 102long n,n1,match; long adjl[MAX][MAX]; long mat[MAX]; bool used[MAX];FILE *fi,*fo;void readfile() {fi=fopen("flyer.in","r");fo=fopen("flyer.out","w");fscanf(fi,"%ld%ld",&n,&n1);long a,b;while (fscanf(fi,"%ld%ld",&a,&b)!=EOF)adjl[a][ ++adjl[a][0] ]=b;match=0; }bool crosspath(long k) {for (long i=1;i<=adjl[k][0];i++){long j=adjl[k][i];if (!used[j]){used[j]=true;if (mat[j]==0 || crosspath(mat[j])){mat[j]=k;return true;}}}return false; }void hungary() {for (long i=1;i<=n1;i++){if (crosspath(i))match++;memset(used,0,sizeof(used));} }void print() {fprintf(fo,"%ld",match);fclose(fi);fclose(fo); }int main() {readfile();hungary();print();return 0; }轉載于:https://www.cnblogs.com/tham/p/6827412.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 三星电脑bois怎么开起防毒模式 三星电
- 下一篇: hdu-3790-最短路径问题(dijk