【AC梦工厂】最大流hdu1532模版题
问题:调控水流从s点经过许多不同容量的水管到达t点的使得流量最大值的问题
概念解释:
G(u,v)代表图中的路
c(u,v)代表路的容量
f(u,v)代表的是当前路的流量
r(u,v)代表还能够增加的流量的图,即残量网络:r(u,v)=c(u,v)-f(u,v)
增广路:在残量网络中的一条从s通往t的路径,其中的任何一条路(u,v)都有r(u,v)>0
反向边:从某个节点A到B的路有一条B到A的路使得f(A,B)=r(B,A),反向边的意义是纠正算法中可能出现的错误,意味着将这条路的流量向反向挤回去。
增广路算法:用bfs去找一条最短的增广路,然后沿着这条路径去修改当前流量值,当没有增广路的时候,算法结束,所得即为最大流
算法复杂度为O(V|E|)
解题关键:建了图你就赢
模版题:hdu 1532
题意:给你n个点,m条有向边及其容量,找出1-n的最大流
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
//http://acm.hdu.edu.cn/showproblem.php?pid=1532struct Node
{int to,cap,rev;
};
vector<Node> g[2500];
bool used[2500];void add_edge(int from,int to ,int cap)
{Node n;n.to=to;n.cap=cap;n.rev=g[to].size();g[from].push_back(n);n.to=from;n.cap=0;n.rev=g[from].size()-1;g[to].push_back(n);
}int dfs(int v,int t,int f)
{if(v==t) return f;used[v]=true;for(int i=0;i<g[v].size();i++){Node &e=g[v][i];if(!used[e.to]&&e.cap>0){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d; g[e.to][e.rev].cap+=d; return d;}}}return 0;
}
int max_flow(int s,int t)
{int flow=0;while(1){memset(used,0,sizeof(used));int f=dfs(s,t,INF);if(f==0) return flow;flow+=f;}
}
int main()
{int m,n;while(cin>>n>>m){memset(g,0,sizeof g);for(int i=0;i<n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);add_edge(a,b,c);}printf("%d\n",max_flow(1,m));}return 0;
}
另外一题:poj 1698
题意是有n部电影拍摄,每部电影的拍摄时间只能是固定在一周的某几天,每部电影至少拍摄di天,最多只能拍摄wi个星期,问一个女孩能不能完成所有的电影拍摄。
思路:
将每部电影可以拍摄的日期建立连边,容量设为1,最后检查t的流量是否等于每部电影需要拍摄的时间之和可得答案
s->film: f=di c=di
film->date: c=1
date->t: c=INF
代码:
#include <iostream>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
struct Node
{int to,cap,rev;
};
vector<Node> g[2500];
bool used[2500];void add_edge(int from,int to ,int cap)
{Node n;n.to=to;n.cap=cap;n.rev=g[to].size();g[from].push_back(n);n.to=from;n.cap=0;n.rev=g[from].size()-1;g[to].push_back(n);
}int dfs(int v,int t,int f)
{if(v==t) return f;used[v]=true;for(int i=0;i<g[v].size();i++){Node &e=g[v][i];if(!used[e.to]&&e.cap>0){int d=dfs(e.to,t,min(f,e.cap));if(d>0){e.cap-=d;g[e.to][e.rev].cap+=d;return d;}}}return 0;
}
int max_flow(int s,int t)
{int flow=0;while(1){memset(used,0,sizeof(used));int f=dfs(s,t,INF);if(f==0) return flow;flow+=f;}
}
int main()
{int week[10];int t,film,di,wi,sumdate;cin>>t;while(t--){memset(g,0,sizeof(g));memset(used,0,sizeof(used));sumdate=0;scanf("%d",&film);for(int i=1;i<=film;i++){for(int j=0;j<7;j++)scanf("%d",&week[j]);scanf("%d%d",&di,&wi);add_edge(0,i,di);sumdate+=di;for(int j=0;j<7;j++){if(week[j]==1){for(int k=0;k<wi;k++)add_edge(i,film+1+k*7+j,1); // 不要在后面加上add_edge(film+1+k*7+j,372,1); 这会导致重边的出现}}}for(int j=film+1;j<372;j++){add_edge(j,372,1);}if(sumdate==max_flow(0,372))printf("Yes\n");elseprintf("No\n");}return 0;
}
【AC梦工厂】最大流hdu1532模版题相关推荐
- HDU2896(AC自动机模版题)
AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...
- 畅通工程(并查集模版题)
题意: 多组输入N,M,当N为0退出人输入,N是道路数目,M是村庄总数,随后N行,每行输入三个数两个村庄的编号,以及连接这两个村庄的费用. 对每一组数据输出畅通工程的最低费用,如果不能畅通就输出&qu ...
- 一起来读《游戏设计梦工厂》
一起来读<游戏设计梦工厂>--游戏的结构 一起来读<游戏设计梦工厂>--游戏的结构 不同游戏中的共同点: 玩家 目标 程序 规则 资源 冲突 边界 结果 正规元素 什么给予了玩 ...
- DT大数据梦工厂 第51讲
王家林亲授<DT大数据梦工厂>大数据实战视频"Scala深入浅出实战经典"视频.音频和PPT下载!第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中 ...
- 全球最大的AI创意梦工厂!2019中国高校计算机大赛-人工智能创意赛开始报名啦!...
寻找"最创意"的 AI 新锐! 做"最技术"的创意发现! 提供"最豪华"的资源支持! 争夺"最丰厚"的竞赛奖励! 每一个 ...
- hdu 1286 找新朋友 欧拉函数模版题
找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
- PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
1008. Airline Routes (35) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Given a ...
- DT大数据梦工厂 第55,56讲
王家林亲授<DT大数据梦工厂>大数据实战视频"Scala深入浅出实战经典"视频.音频和PPT下载!第55讲:Scala中Infix Type实战详解 百度云盘:http ...
- Spark分区详解!DT大数据梦工厂王家林老师亲自讲解!
Spark分区详解!DT大数据梦工厂王家林老师亲自讲解! http://www.tudou.com/home/_79823675/playlist?qq-pf-to=pcqq.group 一.分片和分 ...
最新文章
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
- 使用object detection训练并识别自己的模型
- 21. 合并两个有序链表(C语言)
- margin 和 padding 的使用区别
- OpenCV使用Facemark API
- thrift java first demo
- android手写计算器,手写计算器MyScript Calculator
- C#操作-LX3600非接触式IC卡读写器
- 罗格斯的计算机科学,罗格斯大学计算机科学研究生申请截止日期
- 笔记——跟熊浩学沟通
- python识别中文验证码_Python实现验证码识别
- 2017国庆假期学习总结
- 上传图片为线上图片,可以在线访问
- word批注怎么删除计算机名字,【2人回答】Word批注中的名字怎么删除?-3D溜溜网...
- 东辉职校计算机专业录取分数线,2016年上海东辉职校录取分数
- (转)Ogre 天龙八部 GridInfo文件格式说明(正确版)
- tiktok运营学习怎么样
- XDOJ.172 构造表达式
- 致曾经那个优秀的女孩儿
- PIC18F45k22单片机程序文件目录存放架构