POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 24081 | Accepted: 10695 |
Description
Given the preferences of the cows, compute the maximum number of milk-producing assignments of cows to stalls that is possible.
Input
Output
Sample Input
5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2
Sample Output
4
题目链接:POJ 1274
今天用做了这两道题才知道用最大流解决二分匹配的正确姿势 :首先不要一开始就往S、T这两个点里加边,因为很可能一个点会多次与S相连,那这样这个点总的流量就不是1了。
假设二分图的左半部分是集合$L_i$、右半部分是集合$R_i$,那么首先从$L_i$到$R_i$连一条流量为INF的边,然后将$L_i$与$R_i$记录到各自的集合里,然后各自去重,再从S到去重后的左集合中各点连一条容量为1的边,从右集合$R_i$中各点连向T也是一条容量为1的边,然后再跑最大流,代码是POJ的题目代码,HDU的把左边也去重就好了。
至于为什么可以这么做,显然对于左半部任意的点,从源点拿到手的流量只有1,即只能送给右半部的一个点,而且右半部流进汇点的容量也只有1,两边分别这样避免了一个人去匹配多个人或者一个人被多个人匹配的情况。想一想大概是这么个情况,但是中间边的容量为什么是INF,这两题只设1也是可以过的,不是很理解,感觉中间的流量在简单的二分图匹配里设为多少似乎没什么影响,只要大于1就行
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=210<<1;
const int M=N*N*2;
struct edge
{
int to,nxt;
int cap;
};
edge E[M];
int head[N],tot;
int d[N];
vector<int>stall; void init()
{
CLR(head,-1);
tot=0;
stall.clear();
}
void add(int s,int t,int c)
{
E[tot].to=t;
E[tot].cap=c;
E[tot].nxt=head[s];
head[s]=tot++; E[tot].to=s;
E[tot].cap=0;
E[tot].nxt=head[t];
head[t]=tot++;
}
int bfs(int s,int t)
{
CLR(d,INF);
d[s]=0;
queue<int>Q;
Q.push(s);
while (!Q.empty())
{
int now=Q.front();
Q.pop();
for (int i=head[now]; ~i; i=E[i].nxt)
{
int v=E[i].to;
if(d[v]==INF&&E[i].cap)
{
d[v]=d[now]+1;
if(v==t)
return 1;
Q.push(v);
}
}
}
return d[t]!=INF;
}
int dfs(int s,int t,int f)
{
if(s==t||!f)
return f;
int ret=0;
for (int i=head[s]; ~i; i=E[i].nxt)
{
int v=E[i].to;
if(d[v]==d[s]+1&&E[i].cap>0)
{
int d=dfs(v,t,min(f,E[i].cap));
if(d>0)
{
E[i].cap-=d;
E[i^1].cap+=d;
f-=d;
ret+=d;
if(!f)
break;
}
}
}
if(!ret)
d[s]=-1;
return ret;
}
int dinic(int s,int t)
{
int ret=0;
while (bfs(s,t))
ret+=dfs(s,t,INF);
return ret;
}
int main(void)
{
int n,m,b,k,i;
while (~scanf("%d%d",&n,&m))
{
init();
int S=0,T=n+m+1;
for (i=1; i<=n; ++i)
{
scanf("%d",&k);
add(S,i,1);
while (k--)
{
scanf("%d",&b);
add(i,n+b,INF);
stall.push_back(b);
}
}
sort(stall.begin(),stall.end());
stall.erase(unique(stall.begin(),stall.end()),stall.end());
int R=stall.size();
for (i=0; i<R; ++i)
add(n+stall[i],T,1);
printf("%d\n",dinic(S,T));
}
return 0;
}
POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)的更多相关文章
- HDU 2063 过山车 第一道最大二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2063 题目大意: m个女生和n个男生一起做过山车,每一排必须一男一女,而每个女孩愿意和一些男生坐一起,, 你要找 ...
- Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配)
Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall / POJ 1274 The Perfect Stall(二分图最大匹配) Description 农夫约翰上个 ...
- poj——1274 The Perfect Stall
poj——1274 The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25709 A ...
- POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配
两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...
- hdu 2063 过山车(匈牙利算法模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- hdu 2063 过山车 二分匹配(匈牙利算法)
简单题hdu2063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Ot ...
- hdu 2063 过山车(模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Me ...
- [题解]poj 1274 The Perfect Stall(网络流)
二分匹配传送门[here] 原题传送门[here] 题意大概说一下,就是有N头牛和M个牛棚,每头牛愿意住在一些牛棚,求最大能够满足多少头牛的要求. 很明显就是一道裸裸的二分图最大匹配,但是为了练练网络 ...
- poj 1274 The Perfect Stall【匈牙利算法模板题】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20874 Accepted: 942 ...
随机推荐
- SoapUI 设置 request data with json body
--背景 使用WCF定义REST风格的WebService,如下: [ServiceContract] public interface INISTService { [Op ...
- css content 如何自定义生成图标?
作者:仅愚链接:https://www.zhihu.com/question/22022905/answer/20585820来源:知乎著作权归作者所有,转载请联系作者获得授权. :before(或: ...
- go:windows下用sublime Text搭建go语言开发环境
一.安装 1.安装go go安装包地址:http://pan.baidu.com/s/1hq1mrDM(进入下图中箭头所示目录中下载对应版本) * 注意go的安装路径不能包含中文 ...
- LeetCode 27 Remove Element
Problem: Given an array and a value, remove all instances of that value in place and return the new ...
- iOS/Android 浏览器(h5)及微信中唤起本地APP
在移动互联网,链接是比较重要的传播媒质,但很多时候我们又希望用户能够回到APP中,这就要求APP可以通过浏览器或在微信中被方便地唤起. 这是一个既直观又很好的用户体验,但在实现过程中会遇到各种问题: ...
- caffe下训练时遇到的一些问题汇总
1.报错:“db_lmdb.hpp:14] Check failed:mdb_status ==0(112 vs.0)磁盘空间不足.” 这问题是由于lmdb在windows下无法使用lmdb的库,所以 ...
- php页面编码与字符操作
我们可以用header来定义一个php页面为utf编码或GBK编码,也可以在html中用meta标签来指定编码 例如:php页面为utf编码 header("Content-type: ...
- Socket通信原理探讨(C++为例)
一.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3 ...
- [生活日记]参与unity非游戏行业开发者大会小结
今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国, ...
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
实施过程: 一.安装Windows Server2008 R2操作系统 (过程略) 二.安装域控制器 1. 修改电脑名称 2.修改电脑DNS 三.配置AD 1.在"服务器管理器"- ...