题目:http://poj.org/problem?id=3281

网络流做图中的匹配,注意为了限制每头牛只匹配一种食物和一种饮料,要把牛拆成两个点,之间连边权为1的边。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int n,f,d,head[],ct=,inf=1e9,cur[],ans,dep[],t;
struct N{
int to,next,w;
N(int t=,int n=,int ww=):to(t),next(n),w(ww) {}
}edge[];
void add(int x,int y)
{
edge[++ct]=N(y,head[x],);head[x]=ct;
edge[++ct]=N(x,head[y],);head[y]=ct;
}
bool bfs()
{
memset(dep,,sizeof dep);
while(q.size())q.pop();
q.push();dep[]=;
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(!dep[u]&&edge[i].w)
{
dep[u]=dep[x]+;
q.push(u);
}
}
}
return dep[t];
}
int dfs(int x,int f)
{
if(x==t)return f;//
int res=;
for(int i=cur[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dep[u]==dep[x]+&&edge[i].w)
{
int tmp=dfs(u,min(edge[i].w,f-res));
edge[i].w-=tmp;
edge[i^].w+=tmp;
res+=tmp;
if(edge[i].w)cur[x]=i;
if(res==f)return f;
}
}
if(res==)dep[x]=;
return res;
}
int main()
{
scanf("%d%d%d",&n,&f,&d);
t=*n+f+d+;
for(int i=;i<=f;i++)
add(,i);
for(int i=;i<=n;i++)
{
int x,y,dc;
scanf("%d%d",&x,&y);
for(int j=;j<=x;j++)
{
scanf("%d",&dc);
add(dc,i+f);
}
add(i+f,i+n+f);
for(int j=;j<=y;j++)
{
scanf("%d",&dc);
add(i+n+f,dc+*n+f);
}
}
for(int i=;i<=d;i++)
add(i+*n+f,t);
while(bfs())
{
for(int i=;i<=t;i++)cur[i]=head[i];
ans+=dfs(,inf);
}
printf("%d",ans);
return ;
}

poj3281Dining——网络流匹配的更多相关文章

  1. (网络流 匹配 KM) Going Home --poj -- 2195

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/D 有n个人有n栋房子,每栋房子里能进一个人,但每走一格 ...

  2. EZOJ 宝石迷阵 建图+网络流匹配

    题面: 封印恶魔的地方可以看作是一个 n*m 的矩形,包含了 n*m 个祭坛,并且其 中有一些祭坛已经损坏了. 如果 i+j 为偶数,那么第 i 行第 j 列的祭坛只要没有损坏,就一定会封印有一个恶魔 ...

  3. jsoi2018 R1R2

    Jsoi2018 R1: D1:T1:签到题,状压dp,(思考:讲题人说可以卡一卡空间,怎么做?) T2:50pts:贪心,因为无重复 100pts:线段树合并? T3:25pts 树形dp D1:T ...

  4. 【BZOJ4205】卡牌配对

    Description 现在有一种卡牌游戏,每张卡牌上有三个属性值:A,B,C.把卡牌分为X,Y两类,分别有n1,n2张. 两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且 ...

  5. NITACMOJ144稳定串

    点我>>题目链接 稳定串 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java ...

  6. soj115 御坂网络

    题意:平面上有n个A发射点和m个B发射点,可以选择安置相应A/B装置,装置范围是圆,自取半径(要求都相同且<=Rmax).异种要求范围不相交.求装置范围之和(不是并!). 标程: #includ ...

  7. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  8. 【wikioi】1922 骑士共存问题(网络流/二分图匹配)

    用匈牙利tle啊喂?和网络流不都是n^3的吗(匈牙利O(nm), isap O(n^2m) 但是isap实际复杂度很优的(二分图匹配中,dinic是O(sqrt(V)*E),不知道isap是不是一样. ...

  9. hiho 第117周 二分图多重匹配,网络流解决

    描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含 ...

随机推荐

  1. 从epoll构建muduo-12 多线程入场

    mini-muduo版本号传送门 version 0.00 从epoll构建muduo-1 mini-muduo介绍 version 0.01 从epoll构建muduo-2 最简单的epoll ve ...

  2. 移除WordPress文章图片的宽度和高度属性

    通过WordPress自身的媒体上传功能插入到文章的图片,都会默认添加了高度和宽度属性: <img title="使用 Chrome Workspace 进行网站调试 | 倡萌的自留地 ...

  3. MySQL常见的数据类型(八)

    不多说,直接上干货! MySQL常见的数据类型 一.数据类型是什么? 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 有一些数据是要存储为数字 ...

  4. iOS开发入门

    https://github.com/qinjx/30min_guides/blob/master/ios.md 任何C源程序,不经修改,即可通过Objective-C编译器成功编译 Objectiv ...

  5. 深入浅出Stream和parallelStream

    https://blog.csdn.net/darrensty/article/details/79283146

  6. nodejs实如今线群聊

    这不是一个项目而是一个适合刚開始学习的人学习的样例.主要实现了下面基本功能: 1:群聊.每个人都能够收到其它人的消息,以及能够发消息给其它人,每个人用ip地址标识. 2:显示当前在线用户. 3:每个用 ...

  7. Can a GridView have a footer and header just like ListView?

    Aquick question: In ListView I use this code: list.addHeaderView(headerView); How to deal with it wh ...

  8. UVA 11077 - Find the Permutations(递推)

    UVA 11077 - Find the Permutations option=com_onlinejudge&Itemid=8&page=show_problem&cate ...

  9. 在JDK 6和JDK 7的substring()方法的区别?

    原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...

  10. JDK动态proxy原理解析

    转: 之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白 ...