hdu4292Food(最大流Dinic算法)
/*
题意:每一个人都有喜欢的吃的和喝的,每一个人只选择一个数量的吃的和一个数量的喝的,问能满足最多的人数!?
思路:建图很是重要!f-food, p-people, d-drink
建图: 0(源点)--->f--->p---->p'---->d--->t(汇点)
将人拆分很是重要,因为每一个人最多只能有一种选择,也就是p--->p'的最大流量是 1!
如果还是不清楚,看一看下图的例子,将人拆分与不拆分的区别!
*/
1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#define N 850
#define M 201000
#define INF 0x3f3f3f3f
using namespace std; struct EDGE{
int v, cap, nt;
}; int first[N];
EDGE g[M];
int cnt;
int n, f, d; void addEdge(int u, int v, int cap){
g[cnt].v=v;
g[cnt].cap=cap;
g[cnt].nt=first[u];
first[u]=cnt++; g[cnt].v=u;
g[cnt].cap=;
g[cnt].nt=first[v];
first[v]=cnt++;
} int ans, ss; queue<int>q;
int dist[N]; bool bfs(){
memset(dist, , sizeof(dist));
dist[]=;
q.push();
while(!q.empty()){
int u=q.front();
q.pop();
for(int e=first[u]; ~e; e=g[e].nt){
int v=g[e].v;
int cap=g[e].cap;
if(!dist[v] && cap>){
dist[v]=dist[u]+;
q.push(v);
}
}
}
if(dist[ss+]==) return false;
return true;
} int dfs(int u, int flow){
int ff;
if(u==ss+) return flow;
for(int e=first[u]; ~e; e=g[e].nt){
int v=g[e].v;
int cap=g[e].cap;
if(dist[v]==dist[u]+ && cap> && (ff=dfs(v, min(cap, flow)))){
g[e].cap-=ff;
g[e^].cap+=ff;
return ff;
}
}
dist[u]=-;//表示u节点不能到达汇点!
return ;
} void Dinic(){
ans=;
int d;
while(bfs())
while(d=dfs(, INF))
ans+=d;
} int main(){
while(scanf("%d%d%d", &n, &f, &d)!=EOF){
ss=*n+f+d;
cnt=;
memset(first, -, sizeof(first));
for(int i=; i<=f; ++i){//源点到吃的建一条有向边,最大流量为吃的的数量
int x;
scanf("%d", &x);
addEdge(, i, x);
} for(int i=; i<=d; ++i){//喝的到汇点建一条有向边,最大流量为喝的的数量
int x;
scanf("%d", &x);
addEdge(n*+f+i, ss+, x);
}
for(int i=; i<=n; ++i){//吃的到人建一条有向边,最大流量为1
getchar();
for(int j=; j<=f; ++j){
char ch;
scanf("%c", &ch);
if(ch=='Y')
addEdge(j, f+i, );
}
} for(int i=; i<=n; ++i){//人到喝的建一条有向边,最大流量为1
addEdge(f+i, n+f+i, );//人属于节点容量,将人进行拆分,因为每一个人只能有一种选择!
getchar();
for(int j=; j<=d; ++j){
char ch;
scanf("%c", &ch);
if(ch=='Y')
addEdge(n+f+i, f+n*+j, );
}
} Dinic();
printf("%d\n", ans);
}
return ;
}
hdu4292Food(最大流Dinic算法)的更多相关文章
- 网络流之最大流Dinic算法模版
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- 最大流——Dinic算法
前面花了很长时间弄明白了压入-重标记的各种方法,结果号称是O(V3)的算法测demo的时候居然TLE了一个点,看了题解发现所有人都是用Dinic算法写的,但它的复杂度O(V2E)明显高于前者,具体是怎 ...
- 求最大流dinic算法模板
//最短增广路,Dinic算法 struct Edge { int from,to,cap,flow; };//弧度 void AddEdge(int from,int to,int cap) //增 ...
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- 最大流Dinic算法
嘿嘿嘿,时隔不久又见到了DInic,再次回顾一下吧 不过这次我倒是不想深究,而是想多做一些题,因为这几次比赛下来,算法不是重点,重点是题目如何转化,算法如何应用,这也是比赛为什么让你带着板子的原因吧, ...
- hdu-3572 Task Schedule---最大流判断满流+dinic算法
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持 ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- 网络流(最大流-Dinic算法)
摘自https://www.cnblogs.com/SYCstudio/p/7260613.html 网络流定义 在图论中,网络流(Network flow)是指在一个每条边都有容量(Capacity ...
随机推荐
- Software Testing hw2
Fault的定义:可能导致系统或功能失效的异常条件(Abnormal condition that can cause an element or an item tofail.),可译为“故障”. ...
- eclipse maven testng
安装过程: 1.eclipse官网下载:
- python 装饰器初步学习
第一步 简单函数 ''' 简单的函数:调用两次''' def myfunc(): print ('myfunc() called.') myfunc() myfunc() 第二步 装饰器为调用函数提供 ...
- oracle数据库导入导出
简单记录下数据泵导出导入expdp .impdp 和 普通导出导入 exp.imp 一.数据泵导出数据库(按用户)步骤: 1.以oracle用户登录oracle所在服务器,创建数据库备份文件目录 &g ...
- position定位
CSS盒模型和定位的类型 为了搞清楚定位首先你得了解CSS盒模型.在上一句中的链接是我写在InstantShift 中的一篇关于盒模型的文章.我在那篇文章做了详细的讲解并会在这篇文章中做一个快速的总结 ...
- halcon读取一张照片,并转化为灰度图像
dev_close_window () read_image (Image, 'E:/图片/123.jpg') get_image_size (Image, Width, Height) dev_op ...
- java提高篇(八)----详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- Ehcache BigMemory: 摆脱GC困扰
问题 使用java开源项目经常需要调优jvm,以优化gc.对于gc,如果对象都是短时对象,那么jvm相对容易优化,假如碰上像solr使用自带java cache的项目,那么gc严重受限于cache,因 ...
- AI-随机迷宫&迷宫求解
本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机 ...
- Java-继承,多态0922-05
28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长.宽.高属性, 和计算体积的方 ...
