bzoj 1570: [JSOI2008]Blue Mary的旅行 分层图网络流
来源:互联网 发布:所有香烟条形码数据库 编辑:程序博客网 时间:2024/05/23 13:03
题意
在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市。Blue Mary决定亲自去签下这份订单。为了节省旅行经费,他的某个金融顾问建议只购买U航空公司的机票。U航空公司的所有航班每天都只有一班,并且都是上午出发当天下午到达的,所以他们每人每天只能坐一班飞机。经过调查,他们得到了U航空公司经营的所有航班的详细信息,这包括每一航班的出发地,目的地以及最多能买到的某一天出发的票数。(注意: 对于一个确定的航班,无论是哪一天,他们最多能买到的那一天出发的票数都是相同的。) Blue Mary注意到他们一定可以只乘坐U航空公司的航班就从A市到达B市,但是,由于每一航班能买到的票的数量的限制,他们所有人可能不能在同一天到达B市。所以现在Blue Mary需要你的帮助,设计一个旅行方案使得最后到达B市的人的到达时间最早。
2 <= N <= 50
1 <= M <= 2450
1 <= T <= 50
1 <= X,Y <= N
X != Y
1 <= Z <= 50
分析
对于每一天新开一层,每条边连接相邻的两层,然后直接跑网络流即可。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N=5005;const int inf=0x3f3f3f3f;int n,m,q,ans,s,t,cnt,last[N],dis[N],cur[N];struct edge{int to,next,c;}e[N*1000];struct data{int u,v,w;}a[2505];queue<int> que;int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int point(int x,int y){ return x*n+y+1;}void addedge(int u,int v,int c){ e[++cnt].to=v;e[cnt].c=c;e[cnt].next=last[u];last[u]=cnt; e[++cnt].to=u;e[cnt].c=0;e[cnt].next=last[v];last[v]=cnt;}bool bfs(int n){ for (int i=0;i<=n;i++) dis[i]=0; while (!que.empty()) que.pop(); dis[s]=1;que.push(s); while (!que.empty()) { int u=que.front();que.pop(); for (int i=last[u];i;i=e[i].next) if (e[i].c&&!dis[e[i].to]) { dis[e[i].to]=dis[u]+1; if (e[i].to==t) return 1; que.push(e[i].to); } } return 0;}int dfs(int x,int maxf){ if (x==t||!maxf) return maxf; int ret=0; for (int &i=cur[x];i;i=e[i].next) if (e[i].c&&dis[e[i].to]==dis[x]+1) { int f=dfs(e[i].to,min(e[i].c,maxf-ret)); e[i].c-=f; e[i^1].c+=f; ret+=f; if (maxf==ret) break; } return ret;}void dinic(int n){ while (bfs(n)) { for (int i=0;i<=n;i++) cur[i]=last[i]; ans+=dfs(s,inf); }}int main(){ n=read();m=read();q=read();cnt=1;s=0;t=1; for (int i=1;i<=m;i++) a[i].u=read(),a[i].v=read(),a[i].w=read(); addedge(s,point(0,1),q); for (int now=1;now<=n+q;now++) { for (int i=1;i<=m;i++) addedge(point(now-1,a[i].u),point(now,a[i].v),a[i].w); addedge(point(now,n),t,inf); for (int i=1;i<=n;i++) addedge(point(now-1,i),point(now,i),inf); dinic(point(now,n)); if (ans==q) { printf("%d",now); return 0; } } return 0;}
阅读全文
0 0
- bzoj 1570: [JSOI2008]Blue Mary的旅行 分层图网络流
- BZOJ 1570 JSOI2008 Blue Mary的旅行 网络流
- BZOJ 1570: [JSOI2008]Blue Mary的旅行 最大流分层建图
- bzoj 1570: [JSOI2008]Blue Mary的旅行
- bzoj 1570: [JSOI2008]Blue Mary的旅行
- bzoj 1570: [JSOI2008]Blue Mary的旅行
- 1570: [JSOI2008]Blue Mary的旅行|网络流
- BZOJ P1570[JSOI2008]Blue Mary的旅行
- BZOJ 1570 JSOI 2008 Blue Mary的旅行 网络流
- 1570: [JSOI2008]Blue Mary的旅行 最大流
- bzoj-1570 Blue Mary的旅行
- 【BZOJ1570】【JSOI2008】Blue Mary的旅行 最大流check
- 【bzoj1570】[JSOI2008]Blue Mary的旅行 最大流
- 【BZOJ1570】[JSOI2008]Blue Mary的旅行【最大流】
- [BZOJ1570][JSOI2008]Blue Mary的旅行(最大流)
- [bzoj1570][JSOI2008] Blue Mary的旅行 最大流
- bzoj1570: [JSOI2008]Blue Mary的旅行
- bzoj1570: [JSOI2008]Blue Mary的旅行
- 计蒜客 Minimum Distance in a Star Graph 2017icpc南宁赛区 字符串bfs
- [kuangbin带你飞]专题17:A
- Prototype原型模式和深克隆
- 深入理解vue.js双向绑定的实现原理
- Linux 中模拟延时和丢包的实现
- bzoj 1570: [JSOI2008]Blue Mary的旅行 分层图网络流
- bzoj1212 [HNOI2004]L语言(AC+dp)
- 双向链表的小练习
- 创建maven-web项目eclipse 版本 Version: Oxygen Release
- 谈谈我的保研经历
- springMVC中controller的几种返回方式
- C/C++中static关键字的作用
- nodejs安装不了和npm安装失败的解决方法
- Java零散小知识:使用Servlet时报java.lang.classnotfoundexception