uva11045(网络流 ,二分图匹配问题)
来源:互联网 发布:php 性能测试工具 编辑:程序博客网 时间:2024/06/05 20:18
题目大意:
有一些衣服要发给一些志愿者,每件衣服都有6个码,所以衣服的数量是6的倍数。给出每个志愿者适合的两个码,问每个志愿者是否可以匹配到衣服。
思路:
1-6表示衣服,构造一个超级源点0,一个超级汇点 7 + M,构造超级源点到6的容量是N/6,因为每个码数的衣服的数量是N/6,然后构造衣服到人的边,容量为1,因为每个人只能穿一件衣服,然后构造从人到汇点的容量为1,因为每个人只能选择一件衣服。
最后判断以下最大流是否为M,如果为M证明每个人都被匹配到了,反之就是没有。
代码:
#include <iostream>using namespace std;#include <stdio.h>#include <cstring>#include <queue>const int MAXN = 80;const int INF = 0x3f3f3f3f;int c[MAXN][MAXN];int f[MAXN][MAXN];int mr[MAXN];int p[MAXN];char s[7][5] = {"","XS","S","M","L","XL","XXL"};//char s[7][5] = {"XXL","XL","L","M","S","XS"};int N,M;int maxFlow(int k,int t,int num) { queue <int> q; memset(f,0,sizeof(f));// memset(mr,0,sizeof(mr)); memset(p,0,sizeof(p)); int F = 0; while(1) { memset(mr,0,sizeof(mr)); q.push(k); mr[k] = INF; while(!q.empty()) { int u = q.front(); q.pop(); for(int v = 0 ; v < num; v++) { if(!mr[v] && c[u][v] > f[u][v]) { p[v] = u; q.push(v); mr[v] = min(mr[u],c[u][v] - f[u][v]); } } } if(mr[t] == 0) return F; for(int i = t; i != k; i = p[i]) { f[p[i]][i] += mr[t]; f[i][p[i]] -= mr[t]; } F += mr[t]; }}int main() { int T; char str[5]; scanf("%d",&T); while(T--) { memset(c,0,sizeof(c)); scanf("%d %d",&N,&M); //int NN = N / 6; for(int i = 1; i <= 6; i++) c[0][i] = N/6; for(int i = 1; i <= M; i++){ c[6 + i][7 + M] = 1; scanf("%s",str); for(int j = 1; j <= 6; j++) { if(!strcmp(str,s[j])) { c[j][i + 6] += 1; break; } } scanf("%s",str); for(int j = 1; j <= 6; j++) { if(!strcmp(str,s[j])) { c[j][i + 6] += 1; break; } } } int x = maxFlow (0,7 + M, 8 + M); if(x == M) printf("YES\n"); else printf("NO\n"); } return 0;}
二分图最大匹配:
#include <iostream>using namespace std;#include <stdio.h>#include <cstring>const int N = 80;char s[7][4] = {"","XXL","XL","L","M","S","XS"};int g[N][N];int map[N],vis[N];int n,m,nn;void input() { char s1[4],s2[4]; memset(g,0,sizeof(g)); scanf("%d %d",&n,&m); nn = n / 6; for(int i = 1; i <= m; i++) { scanf("%s%s",s1,s2); int t1,t2; for(int j = 1; j <= 6; j++) { if(!strcmp(s1,s[j])){ t1 = j; break; } } for(int j = 1; j <= 6; j++) { if(!strcmp(s2,s[j])) { t2 = j; break; } } int u,v1,v2; u = n + i; v1 = t1; v2 = t2; for(int j = 0; j < nn; j++) { int t; t = ++g[u][0]; g[u][t] = v1 + 6 * j; t = ++ g[v1 + 6 * j][0]; g[v1 + 6 * j][t] = u; t = ++ g[u][0]; g[u][t] = v2 + 6 * j; t = ++g[v2 + 6 * j][0]; g[v2 + 6 * j][t] = u; } } return ;}int find(int k) { for(int i = 1; i <= g[k][0]; i++) { int v = g[k][i]; if(!vis[v]) { vis[v] = 1; if(!map[v] || find(map[v])) { map[v] = k; return 1; } } } return 0;}void max_match() {// int ans = 0; memset(map,0,sizeof(map)); for(int i = 1; i <= n + m; i++) { memset(vis,0,sizeof(vis)); find(i); } int flag = 1; for(int i = n + 1; i <= n + m; i++) { if(!map[i]) { flag = 0; break; } } if(!flag) puts("NO"); else puts("YES");}int main() { int T; scanf("%d",&T); while(T--) { input(); max_match(); } return 0;}
0 0
- uva11045(网络流 ,二分图匹配问题)
- 网络流|二分图+uva11045
- uva11045(最大二分图匹配)
- 二分图最佳匹配(网络流)
- POJ1087(网络流,二分图匹配)
- [网络流] 二分图匹配
- 圆桌问题【二分图多重匹配】网络流24题
- 飞行员配对方案问题 网络流||二分图匹配
- 二分图最大匹配问题之网络流算法
- [网络流24题] 18 分配问题(二分图最佳匹配,最小费用最大流)
- [题解] [网络流二十四题(一)] 飞行员配对方案问题 (二分图匹配)
- 线性规划与网络流24题の7 试题库问题(二分图匹配)
- 线性规划与网络流24题の5 圆桌问题(二分图多重匹配)
- Tour(二分图最大权匹配)(网络流)
- POJ3041 二分图最大匹配(网络流算法)
- 11082 - Matrix Decompressing (网络流建模|二分图匹配)
- 二分图匹配学习笔记(网络流)
- 【二分图匹配/网络流】宫廷守卫
- The equation 之深入理解扩展欧几里得
- window7在硬盘在安装ubuntu后,win7无法启动问题,或者设置win7默认启动
- Bridged networking for libvirt with NetworkManager: 2014 / Fedora 21
- 快速傅里叶(FFT)
- CentOS下SVN服务器运行,windows作为客户端连接SVN服务器失败的处理
- uva11045(网络流 ,二分图匹配问题)
- python @property
- 无参考图像清晰度评价
- GMap.net控件学习记录
- jquery validate 对隐藏的元素不进行验证
- Mysql学习笔记(1)-Ubuntu下安装和卸载Mysql
- Windows 10下安装Tomcat,文件目录共享访问
- 直击3.15
- 《非诚勿扰》:你往哪里去,我也往那里去