hdu 3605 Escape【二分图多重匹配】
2015-10-06 19:07
357 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605
多重匹配
代码:
多重匹配
代码:
#include <iostream> #include <algorithm> #include <set> #include <map> #include <string.h> #include <queue> #include <sstream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string> using namespace std; const int MAXN = 101000;//左点数 const int MAXM = 12;//右 int un, vn; int g[MAXN][MAXM]; int linker[MAXM][MAXN]; bool used[MAXM]; int num[MAXM]; bool dfs(int u) { for (int v = 0;v < vn;v++) { if (g[u][v] && !used[v]) { used[v] = true; if (linker[v][0] < num[v]) { linker[v][++linker[v][0]] = u; return true; } for (int i = 1;i <= num[v];i++) { if (dfs(linker[v][i])) { linker[v][i] = u; return true; } } } } return false; } bool hungry() { int res = 0; for (int i = 0;i < vn;i++) linker[i][0] = 0; for (int i = 0;i < un;i++) { memset(used, false, sizeof(used)); if (!dfs(i)) return false; } return true; } int main() { while (scanf("%d%d", &un, &vn) != EOF) { memset(g, 0, sizeof(g)); memset(num, 0, sizeof(num)); memset(linker,0,sizeof(linker)); for (int i = 0;i < un;i++) for (int j = 0;j < vn;j++) scanf("%d", &g[i][j]); for (int i = 0;i < vn;i++) scanf("%d", &num[i]); if (hungry()) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- 控制器(Controller) – ASP.NET MVC 4 系列
- Java中二维矩阵的表示与转换,转自51CTO
- 起泡排序/快速排序
- 【图像处理】代码优化技巧
- javax.jms及java消息机制
- 小小
- FZU 2204 7 dp+预处理
- 条款16:成对使用new以及delete的时候应该采取相同的形式
- 获取沙盒路径的方法
- 何恺明经典去雾算法之 Single Image Haze Removal
- Android学习实践:8.简单的屏幕提示Toast
- 明白这十个故事-->你也就参悟了人生 .
- 五校联考六T3
- 发现微创软件在我心目中排全国第一的一个理由
- codeforces 486D D. Valid Sets(树形dp)
- sql优化
- [每天学一点Linux系列]Linux常用的命令
- 剑指·offer:和为S的两个数字
- vocabulary tree
- 【bzoj4145】【AMPPZ2014】【The Prices】【状压dp】