二分图最大匹配 匈牙利算法
二分图最大匹配板子
/**************************************************** 二分图匹配(匈牙利算法的DFS实现) INIT:g[][]两边定点划分的情况 CALL:res=hungary();输出最大匹配数 优点:适于稠密图,DFS找增广路快,实现简洁易于理解 时间复杂度:O(VE); ****************************************************/ #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <vector> #define LL long long #define INF 0x3f3f3f3f using namespace std; const int MAXN = 1e3; int uN, vN; int g[MAXN][MAXN]; int linker[MAXN]; bool used[MAXN]; bool dfs(int u) { for(int v = 1; v <= vN; v++){ if(g[u][v] && !used[v]){ used[v] = true; if(linker[v] == -1 || dfs(linker[v])){ linker[v] = u; return true; } } } return false; } int match() { int res = 0; memset(linker, -1, sizeof(linker)); for(int u = 0; u <= uN; u++){ memset(used, 0, sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int u, v, K; while(~scanf("%d", &K) && K){ memset(g, 0, sizeof(g)); //memset(used, 0, sizeof(used)); memset(linker, -1, sizeof(linker)); scanf("%d%d", &uN, &vN); for(int i = 1; i <= K; i++){ scanf("%d%d", &u, &v); g[u][v] = 1; } int ans = match(); printf("%d\n", ans); } return 0; }
入门题:
HDU 2063 过山车
大佬:https://www.cnblogs.com/kuangbin/archive/2011/08/09/2132828.html