Food HDU - 4292 网络流 拆点建图
http://acm.hdu.edu.cn/showproblem.php?pid=4292
给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料
写的时候一共用了2种拆点建图的方法...
1.
起点连接饮料和食物,容量为拥有的数量
每个人被拆成三个点,$a,b,c$ $a$被想要的食物连接,$b$被想要的饮料连接,$c$被$a,b$连接,容量均为1
然后$c$点连接汇点,容量为2,最后遍历所有静态链表节点,对于所有指向汇点的边,如果剩余容量为0,则答案++
然而错了,有的点会为了更大的流量而不填满$C-T$的边...会少算很多
2.
汇点连接食物,容量为拥有量,把每个人拆成2个点$a,b$,$a$被食物连接,$a$再连接$b$,$b$再连接饮料,容量均为1,最终饮料连接汇点容量为拥有量,
- #include <bits/stdc++.h>
- #define ll long long
- #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
- #define pp pair<int,int>
- #define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
- #define per(ii,a,b) for(int ii=a;ii>=b;ii--)
- #define show(x) cout<<#x<<"="<<x<<endl
- #define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
- #define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
- #define showa(a,b) cout<<#a<<'['<<b<<"]="<<b[a]<<endl
- using namespace std;
- const int maxn=1e4+10;
- const int maxm=1e6+10;
- const int INF=0x3f3f3f3f;
- int casn,n,m,k;
- struct node {int to;int cap;int next;}e[maxm];
- int ss,tt,head[maxn],nume,dis[maxn];
- inline void addx(int a,int b,int c){
- e[++nume]=(node){b,c,head[a]};
- head[a]=nume;
- }
- inline void add(int a,int b,int c){
- addx(a,b,c);addx(b,a,0);
- }
- bool bfs(int s=ss,int t=tt){
- int top=0,end=1;
- int q[maxn];
- q[0]=s;
- // for(int i=0;i<=t;i++) dis[i]=0;
- memset(dis,0,sizeof dis);
- dis[s]=1;
- while(top!=end){
- int now=q[top++];top%=maxn;
- for(int i=head[now];i;i=e[i].next){
- int to=e[i].to;
- if(!dis[to]&&e[i].cap){
- dis[to]=dis[now]+1;
- if(to==t)break;
- q[end++]=to;end%=maxn;
- }
- }
- }
- return dis[t];
- }
- int dfs(int now=ss,int last=INF){
- if(now==tt)return last;
- int flow=0,det;
- for(int i=head[now];i;i=e[i].next){
- int to=e[i].to;
- if(e[i].cap&&dis[to]==dis[now]+1){
- det=dfs(to,min(last-flow,e[i].cap));
- flow+=det;
- e[i].cap-=det;
- e[i^1].cap+=det;
- if(flow==last) return last;
- }
- }
- dis[now]=-1;
- return flow;
- }
- int a,b,c;
- char ch[maxn];
- int main(){
- //#define test
- #ifdef test
- freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
- #endif
- int d,f;
- while(~scanf("%d%d%d",&n,&f,&d)){
- memset(head,0,sizeof head);
- nume=1;
- ss=0,tt=d+f+3*n+1;
- rep(i,1,f) {
- scanf("%d ",&a);
- add(ss,i,a);
- }
- rep(i,1,d){
- scanf("%d ",&a);
- add(i+f+2*n,tt,a);
- }
- rep(i,1,n){
- scanf("%s",ch);
- rep(j,1,f){
- if(ch[j-1]=='Y') add(j,i+f,1);
- }
- }
- rep(i,1,n){
- scanf("%s",ch);
- rep(j,1,d){
- if(ch[j-1]=='Y') add(i+f+n,j+f+2*n,1);
- }
- add(i+f,i+f+n,1);
- }
- int ans=0;
- while(bfs()){ans+=dfs();}
- printf("%d\n",ans);
- }
- #ifdef test
- fclose(stdin);fclose(stdout);system("out.txt");
- #endif
- return 0;
- }
Food HDU - 4292 网络流 拆点建图的更多相关文章
- POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...
- HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧
题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...
- hdu 2732 Leapin' Lizards (最大流 拆点建图)
Problem Description Your platoon of wandering lizards has entered a strange room in the labyrinth yo ...
- 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)
Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...
- hdu 2732 Leapin' Lizards 最大流 拆点 建图
题目链接 题意 给定一张网格,格子中有些地方有柱子,有些柱子上面有蜥蜴. 每个柱子只能承受有限只蜥蜴从上面经过.每只蜥蜴每次能走到相距曼哈顿距离\(\leq k\)的格子中去. 问有多少只蜥蜴能走出网 ...
- 网络流--最大流--POJ 2139(超级源汇+拆点建图+二分+Floyd)
Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...
- poj 3281 Dining 网络流-最大流-建图的题
题意很简单:JOHN是一个农场主养了一些奶牛,神奇的是这些个奶牛有不同的品味,只喜欢吃某些食物,喝某些饮料,傻傻的John做了很多食物和饮料,但她不知道可以最多喂饱多少牛,(喂饱当然是有吃有喝才会饱) ...
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- net-snmp开发教程
目录 1................................................................................................ ...
- PHP6天基础知识部分
---恢复内容开始--- (一).基础(PHP超文本预处理器) 1.PHP标记(2种) 1.<?php?>:大众的用法?和php之间不能有空格否则无效. 2.<??>:小众的用 ...
- ACM-ICPC 2018 南京赛区网络预赛 C GDY(模拟)
https://nanti.jisuanke.com/t/30992 题意 把m张牌(牌上数字范围是1-13)放到栈里n个人,每个人首次从栈顶取5张牌,轮流取取完牌后,第1个人出他手里最小的牌,然后2 ...
- [Android] Android 注解绑定UI View组件库 ButterKnife 的使用
ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神JakeW ...
- spring boot零碎知识点待补充
@Controller 和@RestController的区别 @RestController相当于同时使用了@Controller和@ResponseBody 即不会使用视图解析器,返回值直接返回 ...
- Windows Server 2008 R2中无法使用360免费Wifi的解决方案
为了使主机和虚拟机在同一个无线网络中,而虚拟机的系统是Windows Server 2008 R2 64位的,使用360免费wifi,始终无法开启.在网上查找解决方案,终于找到了原因:Windows ...
- glide:4.7.1 与 26.1.0冲突
implementation 'com.android.support:support-v4:26.1.0'implementation 'com.github.bumptech.glide:glid ...
- 15个新鲜出炉的 Photoshop 文本效果教程
文本效果可能是 Photoshop 图形设计中最常用和最通用的技术之一.最重要的是你可以使用任何效果,风格或纹理来产生有趣的排版,越多人尝试过它并制作了一些精彩的教程.所以这篇文章旨在为您提供全面的 ...
- oracle 重建索引以及导出所有的索引脚本(可以解决还原数据库文件时先还原数据,在重新用脚本创建索引)
导出数据库备份文件 1. 备份服务器数据,采用并行方式,加快备份速度(文件日期根据具体操作日期修改) expdp jhpt/XXXX directory=databackup dumpfile=dpf ...
- bebugger调试理解commonJS原理
上面图片是bebugger一个导入的模块,使用vscode可以轻松的看到调用栈,通过断点调试进入断点 Mode函数的原型里面有一个require方法,函数里面有Module._load()加载模块,传 ...