匈牙利算法,求最大匹配数即最小顶点覆盖

来源:互联网 发布:php软件工程师 编辑:程序博客网 时间:2024/06/05 20:04

#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;}


1 0