二分图图匹配

来源:互联网 发布:unity3d将base64转图片 编辑:程序博客网 时间:2024/04/30 00:28

dog dog 明明是讲网络流我却突然get了二分图匹配微笑


看来图论才是真爱。

去他的 增广路,不就是找两两匹配嘛。‘

准备给你们画个图的,但是!

好麻烦哦,算了自己懂就行了是伐。

假设123 ABC。

首先对第一个点进行dfs,如果 找到一条边链接,return true,假设1与A连接。

然后对第二个点进行dfs,如果他和原来已经使用过的点有边,如2与A也有边,那我们就先假设断掉1与A,再来找1与其他点有没有边,找到就连接,2与A连接,return true,若1没有找到,则不更改,return false。

。。。。

代码突然好懂,dog dog。

#include<iostream>#include<algorithm>#include<string>#include<queue>#include<cmath>#include<vector>#include<stdlib.h>#include<iomanip>#include<list>#include<stack>#include<memory.h>#include<ctype.h>using namespace std;typedef long long ll;const int MAXN = 510;int uN, vN;int g[MAXN][MAXN];int linker[MAXN];bool used[MAXN];bool dfs(int u){int v;for (v = 0; 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 hungary(){int res = 0;int u;memset(linker, -1, sizeof(linker));for (u = 0; u<uN; u++){memset(used, 0, sizeof(used));if (dfs(u)) res++;}return res;}int main(){int m;int u, v;int iCase = 0;while (scanf("%d%d%d", &uN, &vN, &m) != EOF){iCase++;if (uN == 0 && vN == 0 && m == 0)break;for (int i = 0; i<uN; i++)for (int j = 0; j<vN; j++)g[i][j] = 1;while (m--){scanf("%d%d", &u, &v);u--;v--;g[u][v] = 0;}printf("Case %d: %d\n", iCase, uN + vN - hungary());}return 0;}






原创粉丝点击