#include <iostream>
using namespace std;
#define N 10
//是否存在连线
bool edge[N][N];
//配对集,-1表示为配对,其他为配对下标
int y[N];
//配对元素是否已访问
bool visited[N];
void init() {
memset(edge, false, sizeof(bool) * N * N);
edge[0][0] = edge[0][1] = edge[0][3] = true;
edge[1][1] = edge[1][4] = true;
edge[2][0] = edge[2][3] = edge[2][6] = true;
edge[3][2] = edge[3][3] = edge[3][5] = true;
edge[4][3] = true;
edge[5][3] = true;
}
int path(int u, int xlen) {
for (int i = 0; i < xlen; ++i) {
if (edge[u][i] && !visited[i]) {
visited[i] = true;
if (y[i] == -1 || path(y[i], xlen)) {
y[i] = u;
return 1;
}
}
}
return 0;
}
int maxmatch(int xlen) {
int res = 0;
memset(y, -1, sizeof(int) * xlen);
for (int i = 0; i < xlen; ++i) {
memset(visited, 0, sizeof(bool) * xlen);
if (path(i, xlen)) {
res++;
}
}
return res;
}
int main() {
init();
cout << "result: " << maxmatch(N) << endl;
return 0;
}
匈牙利算法,求最大匹配数即最小顶点覆盖
最新推荐文章于 2021-09-06 03:18:38 发布