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

题目大意:John养了N只奶牛,他为奶牛准备了F个食物和D个饮料,但是每只奶牛只对其中的一些饮料和食物感兴趣,现在请制定一些方案,使得尽可能多的奶牛吃到自己感兴趣的食物和饮料,求出最多满足奶牛的个数。

思路:拆点建图跑dinic算法最大流,每只奶牛拆成两个点,例如第Ni个奶牛拆为Ni 和 Ni ’ , Ni和Ni'之间建立一条双向边,正向流量是1,反向为0,最后奶牛拆成两部分,两部分之间对应的奶牛相互有边,F个食物对应的再与第一部分的奶牛相连边,容量为1,第二部分的奶牛再与D个饮料相连边,容量仍然为1,再建立一个源点和F个食物相连成F条容量为1的边,D个饮料再与新建立的汇点相连建立D条容量为1的边,最终从源点到汇点跑一边dinic得到的最大流就是最多满足的奶牛个数了。

AC代码:

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 405;
const int MAX = 0x3f3f3f3f;
struct node{
vector<int> vex;
vector<int> num;
}g[maxn];
struct edge{
int u,v,c;
}e[maxn*maxn];
int d[maxn];
int sp,tp;
int edgenum = 0;
void addedge(int u,int v){
e[edgenum].u = u;
e[edgenum].v = v;
e[edgenum].c = 1;
g[u].vex.push_back(v),g[u].num.push_back(edgenum++);
// 建立双向边操作
e[edgenum].u = v;
e[edgenum].v = u;
e[edgenum].c = 0;
g[v].num.push_back(edgenum++),g[v].vex.push_back(u);
}
int bfs(){
memset(d,-1,sizeof(d));
queue<int> q;
q.push(0),d[0] = 0;
while(!q.empty() ){
int cur = q.front() ;
q.pop() ;
for(int i = 0;i<g[cur].num.size() ;i++ ){
int te = g[cur].num[i];
int now = g[cur].vex[i];
if(e[te].c >0 && d[now] == -1){
d[now] = d[cur] + 1;
q.push(now);
}
}
}
return d[tp]!=-1;
}
int dfs(int a,int b){
int r = 0;
if(a == tp){
return b;
}
for(int i = 0;i<g[a].num.size()&& r<b;i++){
int v = g[a].vex[i],te = g[a].num[i];
if(e[te].c >0 && d[v] == d[a] + 1){
int t = min(b - r,e[te].c );
t = dfs(v,t);
r+=t;
e[te].c -=t;
e[te^1].c +=t;
}
}
if(!r){
d[a] = -2;
}
return r;
}
int dinic(int s,int t){
int total = 0,tc;
while(bfs()){
while(1){
tc = dfs(sp,MAX);
if(!tc){
break;
}
total+=tc;
}
}
return total;
}
int main(){
int n,f,d;
cin>>n>>f>>d;
int N = f + 2*n;//拆点建图,每个奶牛拆成两个点,点集标号从f+1到f+2*n
int Nd = N + d;//饮料的标号为 N+1到N + d
sp = 0,tp = Nd + 1;//源点汇点
for(int i = f + 1;i<=f+n;i++){
addedge(i,i+n);//拆点的奶牛相连
}
for(int i = 1;i<=f;i++){
addedge(sp,i);//源点和食物相连
}
for(int i = N + 1;i<=Nd;i++){
addedge(i,tp);//饮料和汇点相连
}
for(int i = 1;i<=n;i++){
int Fi,Di;
cin>>Fi>>Di;
for(int j = 0;j<Fi;j++){
int Tf;
cin>>Tf;
addedge(Tf,i+f);//拆点建图 食物->奶牛1
}
for(int j = 0;j<Di;j++){
int Td;
cin>>Td;
addedge(i+f+n,N+Td);//拆点建图 奶牛2->饮料
}
}
cout<<dinic(sp,tp);
return 0;
}

poj 3281Dining(网络流 拆点)的更多相关文章

  1. ACM Computer Factory POJ - 3436 网络流拆点+路径还原

    http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...

  2. poj 3281(网络流+拆点)

    题目链接:http://poj.org/problem?id=3281 思路:设一个超级源点和一个超级汇点,源点与食物相连,饮料与汇点相连,然后就是对牛进行拆点,一边喜欢的食物相连,一边与喜欢的饮料相 ...

  3. POJ 3281 网络流 拆点 Dining

    题意: 有F种食物和D种饮料,每头牛有各自喜欢的食物和饮料,而且每种食物或者饮料只能给一头牛. 求最多能有多少头牛能同时得到它喜欢的食物或者饮料. 分析: 把每个牛拆点,中间连一条容量为1的边,保证一 ...

  4. POJ 3281 网络流 拆点保证本身只匹配一对食物和饮料

    如何建图? 最开始的问题就是,怎么表示一只牛有了食物和饮料呢? 后来发现可以先将食物与牛匹配,牛再去和饮料匹配,实际上这就构成了三个层次. 起点到食物层边的容量是1,食物层到奶牛层容量是1,奶牛层到饮 ...

  5. poj_3281Dining(网络流+拆点)

    poj_3281Dining(网络流+拆点) 标签: 网络流 题目链接 题意: 一头牛只吃特定的几种食物和特定的几种饮料,John手里每种食物和饮料都只有一个,问最多能够满足几头牛的需求(水和食物都必 ...

  6. POJ 1815 网络流之拆点(这个题还需要枚举)

    传送门:http://poj.org/problem?id=1815 题意:给N个点,已知S与T,和邻接矩阵,求拆掉那些点会减小最大流. 思路:点之间有线连接的在网络中的权值为inf,没有的就不用管, ...

  7. POJ 3281 Dining(网络流拆点)

    [题目链接] http://poj.org/problem?id=3281 [题目大意] 给出一些食物,一些饮料,每头牛只喜欢一些种类的食物和饮料, 但是每头牛最多只能得到一种饮料和食物,问可以最多满 ...

  8. poj 3281 Dining(网络流+拆点)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20052   Accepted: 8915 Descripti ...

  9. POJ 3281 Dining(网络流-拆点)

    Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will c ...

随机推荐

  1. 堆之*bin理解

    在程序运行中,使用bins结构对释放的堆块进行管理,以减少向系统申请内存的开销,提高效率. chunk数据结构 从内存申请的所有堆块,都使用相同的数据结构——malloc_chunk,但在inuse和 ...

  2. laravle中orm简单的增删改查

    友情提示请在有laravel基础的情况下观看文章 1.数据库信息(user表) CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  3. Python中io的open()在PyCharm环境下报错和路劲的问题

    PS:我也是初学者,上班空闲时间学习学习Python.今天学到io的时候,遇到了两个用PyCharm环境编写代码的小白错误,如下: 两个问题都是如下代码: 1. 第一个问题:当写好代码之后,点击运行报 ...

  4. R语言读写数据

    R语言读写数据 一般做模型的时候,从外部的excel中读入数据,我现在常用的比较多的是read_csv(file) 读入之前先把excel数据转化成.csv格式 同样的把结果输出来的时候用的是writ ...

  5. MySql 中IFNULL、ISNULL、NULLIF用法(数据库判空)

    来源:http://blog.csdn.net/a466350665/article/details/52994761 http://blog.csdn.net/xingyu0806/article/ ...

  6. jacob导入项目

    在 resource 下创建一个 lib 将网上下载的 jacob.jar 放入其中 在 pom 文件中导入相对应的 jar 包 <dependency> <groupId>c ...

  7. Wannafly Camp 2020 Day 2J 邦邦的2-SAT模板

    #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n& ...

  8. [HNOI2017] 大佬 - DP,BFS,Hash,单调性

    这真的是一道综合题.然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了? 首先我们考虑到,所有和怼有关的操作都是时刻无关的.也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响 ...

  9. Nginx防止DDOS流量攻击

    DDOS流量攻击:频繁的发送请求,造成宽带占用,其他客户端无法访问                Nginx解决DDOS流量攻击,利用limit_req_zone限制请求次数    limit_con ...

  10. Springboot 中的配置文件

    Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件.他们的作用都是修改Spring Boot自动配置的默认值. 技术:yaml.properties语法,Con ...