POJ-3821-Dining (拆点网络流)
这题为什么不能用 左边放食物,中间放牛,后面放水?
原因很简单,假设一头牛喜欢两个食物AB和两种水AB。
此时可以从一个食物A,走到牛A,再走到水A。
但是还可以有另一条路,从另一个食物B,走到该牛A,并走到该牛喜欢的另一个水B。
这是错误的原因之一,其实也跟反边有关。
所以对于牛,拆开,中间建立一条边,说明该牛已经使用过,这样也避免了从其它食物C走到牛A,此时我们希望它走反边,即牛A到食物A,再从食物A走向其它牛等等,但是却在到达牛A的时候,走向了水B的情况。
#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
using namespace std;
int n,f,d,fi,di;
const int INF=0x3f3f3f3f;
const int maxn=110;
struct Edge {
int to,cap,flow;
};
struct Dinic {
int s,t,cnt;
Edge edge[maxn*maxn*2];
int head[maxn*4];
int next[maxn*maxn*2];
int deep[maxn*4];
int cur[maxn*4];
bool vis[maxn*4];
void addEdge(int u,int v,int w)
{
edge[cnt].to=v;
edge[cnt].cap=w;
edge[cnt].flow=0;
next[cnt]=head[u];
head[u]=cnt++;
edge[cnt].to=u;
edge[cnt].flow=0;
edge[cnt].cap=0;
next[cnt]=head[v];
head[v]=cnt++;
}
void init()
{
s=0;
t=401;
cnt=0;
memset(head,-1,sizeof(head));
for (int i=1;i<=100;i++) {
addEdge(s,i,1);
}
for (int i=301;i<=400;i++) {
addEdge(i,t,1);
}
}
bool bfs()
{
memset(deep,0,sizeof(deep));
memset(vis,0,sizeof(vis));
queue<int> q;
vis[s]=true;
deep[s]=0;
q.push(s);
while (!q.empty()) {
int u=q.front();
q.pop();
for (int i=head[u];i!=-1;i=next[i]) {
Edge &e=edge[i];
if (!vis[e.to]&&e.cap>e.flow) {
deep[e.to]=deep[u]+1;
vis[e.to]=true;
q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int u,int in)
{
if (u==t||in==0) {
return in;
}
int out=0,f=0;
for (int &i=cur[u];i!=-1;i=next[i]) {
Edge &e=edge[i];
if (deep[e.to]==deep[u]+1&&(f=dfs(e.to,min(e.cap-e.flow,in)))>0) {
in-=f;
out+=f;
edge[i].flow+=f;
edge[i^1].flow-=f;
if (in==0) {
break;
}
}
}
return out;
}
int maxflow()
{
int ans=0;
while (bfs()) {
for (int i=0;i<4*maxn;i++) {
cur[i]=head[i];
}
ans+=dfs(s,INF);
}
return ans;
}
void print()
{
for (int i=0;i<=400;i++) {
if (head[i]!=-1) {
printf("%d:",i);
for (int j=head[i];j!=-1;j=next[j]) {
printf("%d %d %d ",edge[j].to,edge[j].cap,edge[j].flow);
}
printf("\n");
}
}
}
}DC;
int main()
{
int food,drink;
scanf("%d%d%d",&n,&f,&d);
DC.init();
for (int i=1;i<=n;i++) {
scanf("%d%d",&fi,&di);
for (int j=0;j<fi;j++) {
scanf("%d",&food);
DC.addEdge(food,100+i,1);
}
DC.addEdge(100+i,200+i,1);
for (int j=0;j<di;j++) {
scanf("%d",&drink);
DC.addEdge(i+200,drink+300,1);
}
}
//DC.print();
printf("%d\n",DC.maxflow());
return 0;
}
/*
2 2 2
1 1 2 1
2 1 2 1 2
*/
POJ-3821-Dining (拆点网络流)的更多相关文章
- POJ 3281 Dining (拆点)【最大流】
<题目链接> 题目大意: 有N头牛,F种食物,D种饮料,每一头牛都有自己喜欢的食物和饮料,且每一种食物和饮料都只有一份,让你分配这些食物和饮料,问最多能使多少头牛同时获得自己喜欢的食物和饮 ...
- poj 3281 Dining 拆点 最大流
题目链接 题意 有\(N\)头牛,\(F\)个食物和\(D\)个饮料.每头牛都有自己偏好的食物和饮料列表. 问该如何分配食物和饮料,使得尽量多的牛能够既获得自己喜欢的食物又获得自己喜欢的饮料. 建图 ...
- poj 3281 Dining(网络流+拆点)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20052 Accepted: 8915 Descripti ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- POJ 3281 Dining(最大流)
POJ 3281 Dining id=3281" target="_blank" style="">题目链接 题意:n个牛.每一个牛有一些喜欢的 ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- POJ 2516 Minimum Cost (网络流,最小费用流)
POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...
- POJ 3281 Dining(网络流拆点)
[题目链接] http://poj.org/problem?id=3281 [题目大意] 给出一些食物,一些饮料,每头牛只喜欢一些种类的食物和饮料, 但是每头牛最多只能得到一种饮料和食物,问可以最多满 ...
- POJ - 3281 Dining(拆点+最大网络流)
Dining Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18230 Accepted: 8132 Descripti ...
- 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)
Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...
随机推荐
- STM32F103之DMA学习记录
/================翻译STM32F103开发手册DMA章节===========================/ 13 DMA(Direct memory access) 13.1 ...
- codeforce D. White Lines
二维前缀和 给你一个n*n的矩阵,里面有两种字符,‘W’和‘B’,代表black 和white .其实这个矩阵就是一个方形画板,你有一个k*k的橡皮只能用一次,使k*k的矩阵里的B变成W,问完全空白的 ...
- Linux基础命令小结(超全!!)
Linux目录结构 1.bin 存放经常使用的指令比如ll,cp 2.sbin 系统管理员使用的系统管理指令 3.home 存放普通用户的住目录 4.root 系统管理员的用户主目录 5.boot 存 ...
- 【C语言】用C语言输出一个吃豆人
大圆盘减去扇形和小圆盘: #include <math.h> #include <stdio.h> int main() { double x, y; ; y >= -; ...
- 结合sqlmap进行sql注入过程
结合sqlmap进行sql注入:(-r后面是通过burp suite抓出来的请求包:-p后面是注入点,即该请求里携带的某个参数) Get请求的注入: ./sqlmap.py -r rss_test.t ...
- eclipse中spring配置文件的自动提示和namespace的添加
在用spring或者springmvc框架进行开发时,编辑applicationcontext.xml等配置文件是必不可少的,在eclipse中打开applicationcontext.xml通常是这 ...
- js无缝滚动跑马灯
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- liunx详解-2
linux安装与配置 安装配置 虚拟机配置1G内存,1核CPU,50G硬盘,网络地址转换(NAT,主机作为路由构建内网) 镜像文件:http://mirror.nsc.liu.se/centos-st ...
- 3.CRUD(增删改查)
Select 选择,查询语句 id:就是对应的namespace中的方法名: resultType:Sql语句执行的返回值: parameterType:参数类型 我们想使用查询语句首先要在UserM ...
- maven中的pom.xml中的scope的作用
pom.xml配置文件中, <dependency>中的<scope>,它主要管理依赖的生效范围.目前<scope>可以使用5个值: * compile,缺省值,适 ...