[bzoj1570][JSOI2008] Blue Mary的旅行 最大流
来源:互联网 发布:微信聊天记录迁移 mac 编辑:程序博客网 时间:2024/05/29 16:08
1570: [JSOI2008]Blue Mary的旅行
Description
在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市。Blue Mary决定亲自去签下这份订单。为了节省旅行经费,他的某个金融顾问建议只购买U航空公司的机票。U航空公司的所有航班每天都只有一班,并且都是上午出发当天下午到达的,所以他们每人每天只能坐一班飞机。经过调查,他们得到了U航空公司经营的所有航班的详细信息,这包括每一航班的出发地,目的地以及最多能买到的某一天出发的票数。(注意: 对于一个确定的航班,无论是哪一天,他们最多能买到的那一天出发的票数都是相同的。) Blue Mary注意到他们一定可以只乘坐U航空公司的航班就从A市到达B市,但是,由于每一航班能买到的票的数量的限制,他们所有人可能不能在同一天到达B市。所以现在Blue Mary需要你的帮助,设计一个旅行方案使得最后到达B市的人的到达时间最早。
Input
第一行包含3个正整数N,M和T。题目中会出现的所有城市分别编号为1,2,…,N,其中城市A编号一定为1,城市B编号一定为N. U公司一共有M条(单向)航班。而连Blue Mary在内,公司一共有T个人要从A市前往B市。 以下M行,每行包含3个正整数X,Y,Z, 表示U公司的每一条航班的出发地,目的地以及Blue Mary最多能够买到的这一航班某一天出发的票数。(即:无论是哪一天,Blue Mary最多只能买到Z张U航空公司的从城市X出发到城市Y的机票。) 输入保证从一个城市到另一个城市的单向航班最多只有一个。
Output
仅有一行,包含一个正整数,表示最后到达B市的人的最早到达时间。假设他们第一次乘飞机的那一天是第一天。
Sample Input
3 3 5
1 2 1
2 3 5
3 1 4
Sample Output
6
HINT
约定:
2 <= N <= 50
1 <= M <= 2450
1 <= T <= 50
1 <= X,Y <= N
X != Y
1 <= Z <= 50
因为一个十分低级的错误调了很久,分k层,一层一层看能不能有T的最大流
#include<iostream>#include<cstring>#include<cstdio> using namespace std;const int N = 300000+5;const int INF = 1000000000 + 7;int last[N],cnt=1,h[N],q[N],cur[N],ans,t;int n,m,T,x[N],y[N],z[N];struct Edge{ int to,v,next;}e[N];void insert( int u, int v, int w ){ e[++cnt].to = v; e[cnt].v = w; e[cnt].next = last[u]; last[u] = cnt; e[++cnt].to = u; e[cnt].v = 0; e[cnt].next = last[v]; last[v] = cnt;} bool bfs(){ int head = 0, tail = 1; memset(h,-1,sizeof(h)); q[0] = 0; h[0] = 0; while( head != tail ){ int u = q[head++]; if( u == t ) return true; for( int i = last[u]; i; i = e[i].next ){ int v = e[i].to; if( h[v] == -1 && e[i].v ){ q[tail++] = v; h[v] = h[u]+1; } } } return false;}int dfs( int x, int f ){ if( x == t ) return f; int w, used = 0; for( int i = cur[x]; i; i = e[i].next ){ int u = e[i].to; if( h[u] == h[x] + 1 && e[i].v ){ w = dfs( u, min(f-used,e[i].v) ); e[i].v -= w; e[i^1].v += w; used += w; if( e[i].v ) cur[x] = i; if( f == used ) return used; } } if( !used ) h[x] = -1; return used;}int main(){ scanf("%d%d%d", &n, &m, &T ); for( int i = 1; i <= m; i++ ) scanf("%d%d%d", &x[i], &y[i], &z[i]); t = (n+T+1)*n+1; ans = 0; insert(0,1,T); for( int k = 1; k <= n+T; k++ ){ for( int i = 1; i <= m; i++ ) insert( (k-1)*n+x[i],k*n+y[i],z[i]); for( int i = 1; i <= n; i++ ) insert( (k-1)*n+i,k*n+i,INF); insert((k+1)*n,t,T); while(bfs()){ for( int i = 0; i <= t; i++ ) cur[i] = last[i]; cur[t] = last[t]; ans += dfs(0,INF); } if( ans == T ){ printf("%d",k); break; } } return 0;}
- 【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的旅行
- 【bzoj1570】Blue Mary的旅行
- 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: [JSOI2008]Blue Mary的旅行
- bzoj 1570: [JSOI2008]Blue Mary的旅行
- bzoj 1570: [JSOI2008]Blue Mary的旅行
- bzoj 1570: [JSOI2008]Blue Mary的旅行 分层图网络流
- Blue Mary的旅行2
- 链表的C++实现(int型) 源代码
- 蒲公英VPN智能组网服务新布局 助力服装企业VPN服务器架设
- app测试员究竟测些什么呢?
- Stack Overflow简单介绍
- org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read
- [bzoj1570][JSOI2008] Blue Mary的旅行 最大流
- SQL必知必会笔记手册
- k8s入门系列之guestbook快速部署
- php基础知识 10,数组的运用
- iOS JSModel转化过程中含有id属性解决办法
- Kali Linux下运行Sniffjoke出错的解决
- Android Tangram模型:连淘宝、天猫都在用的UI框架模型你一定要懂
- 场景解析--Pyramid Scene Parsing Network
- 服务器端返回数据处理