KM演算法模板

2021-08-08 19:24:03 字數 1668 閱讀 2859

**:

這是hdu2255

#include#include#include#include#includeusing namespace std;

const int maxn = 305;

const int inf = 0x3f3f3f3f;

int love[maxn][maxn]; // 記錄每個妹子和每個男生的好感度

int ex_girl[maxn]; // 每個妹子的期望值

int ex_boy[maxn]; // 每個男生的期望值

bool vis_girl[maxn]; // 記錄每一輪匹配匹配過的女生

bool vis_boy[maxn]; // 記錄每一輪匹配匹配過的男生

int match[maxn]; // 記錄每個男生匹配到的妹子 如果沒有則為-1

int slack[maxn]; // 記錄每個漢子如果能被妹子傾心最少還需要多少期望值

int n;

bool dfs(int girl)

} else

}return false;

}int km()

}// 嘗試為每乙個女生解決歸宿問題

for (int i = 0; i < n; ++i) }}

// 匹配完成 求出所有配對的好感度的和

int res = 0;

for (int i = 0; i < n; ++i)

res += love[ match[i] ][i];

return res;

}int main()

return 0;

}

時間久了,上面的看不明白了,那就用下面這個吧

#include#include#includeusing namespace std;

const int qwq=0x7fffffff;

int w[1000][1000]; //w陣列記錄邊權值

int line[1000],u***[1000],usey[1000],cx[1000],cy[1000]; //line陣列記錄右邊端點所連的左端點, u***,usey陣列記錄是否曾訪問過,也是判斷是否在增廣路上,cx,cy陣列就是記錄點的頂標

int n,ans,m; //n左m右

bool find(int x)}}

return false;

}int km()

}if (d==qwq) return -1;

for (int j=1;j<=n;j++)

if (u***[j]) cx[j]-=d;

for (int j=1;j<=m;j++)

if (usey[j]) cy[j]+=d; //新增新邊}}

ans=0;

for (int i=1;i<=m;i++)

ans+=w[line[i]][i];

return ans;

}int main()

cx[i]=d;

}memset(line,0,sizeof(line));

printf("%d\n",km());

}return 0;

}//匈牙利演算法

//km演算法

KM演算法模板

km演算法是用來求完全二分圖最大完美匹配的演算法,其原理是不斷尋找增廣路 增廣路定理 相關性質 在最大二分圖匹配圖中,w x y lx x ly y include include include include include using namespace std const int maxn ...

模板 KM演算法

km 演算法計算帶權二分圖最優匹配 模板一 dfs 演算法,時間複雜度 o n 4 const int maxn 310 const ll inf 0x3f3f3f3f3f3f3f3f match i j表示右邊的第i個點匹配左邊的第j個點,也可能這兩個點之間其實沒有連邊,也就是權值為零 int n...

KM演算法模板

int maxdata 1000000000 int w arraysize arraysize 權值 int match arraysize 儲存匹配資訊,其中i為y中的頂點標號,match i 為x中頂點標號 int lx arraysize ly arraysize slack arraysi...