UVALive5874 - Social Holidaying-二分图匹配/匈牙利算法
2016-02-17 23:19
211 查看
有n个家庭,m个房间,一个房间只能两个家庭住。求最大匹配。
比较标准的二分图问题。先初始化把可能的家庭建边,然后跑一边匈牙利算法。
最后的答案是最大匹配数/2,因为建图时有重复。
比较标准的二分图问题。先初始化把可能的家庭建边,然后跑一边匈牙利算法。
最后的答案是最大匹配数/2,因为建图时有重复。
#include <cstdio> #include <algorithm> #include <cstring> #include <map> using namespace std; const int MAXN = 410; int uN,vN; int g[MAXN][MAXN]; int linker[MAXN]; bool used[MAXN]; int 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 Hungarian() { int res = 0; memset(linker,-1,sizeof linker); for(int u=1;u<=uN;u++) { memset(used,false,sizeof used); if(dfs(u)) res++; } return res; } int T,n,m; int R[500]; map<int,int> B; int main() { scanf("%d",&T); while(T--) { B.clear(); memset(g,0,sizeof g); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&R[i]); } for(int i=0;i<m;i++) { int tmp=0; scanf("%d",&tmp); B[tmp] = 1; } uN = n;vN = n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i == j) continue; if(B[R[i]+R[j]] == 1) { g[i][j]=g[j][i]=1; } } } printf("%d\n",Hungarian()/2); } }
相关文章推荐
- Java数组
- XSS中JavaScript加密以及Filter bypass
- oracle中同义词的使用和授权ddl语句的简单记录
- qemu debugging using gdb
- pre标签的css代码,防止代码pre中代码过长等问题
- 求关注~
- CentOS安装Apache, Mysql及php
- noj 1058 Tom and Jerry
- 【Linux运维入门】Maven将项目部署到Nexus
- C++ 枚举类型的思考
- 纹理
- 2015年写的重要文章
- UVALive5876-Writings on the Wall-KMP
- linux下获取主机信息
- 更改Toast显示位置的技巧
- 2016蓝桥杯假期任务之《最大乘积》
- 对原生态JDBC程序中问题总结
- Spark源码分析之四:Stage提交
- 兼容浏览器的css inline-block写法
- c:c++内存分配