BZOJ2696: 航班安排

网络流·费用流

题解:

引用自fqk dalao的博客!这道题也是他教的!MOD一下!
http://blog.csdn.net/Phenix_2015/article/details/50843982

先让我重新说一下题意qwq。
有n个机场,机场两两之间需要的最短时间是 f[i,j] f[i,j],花费的费用是一个固定值 c[i,j] c[i,j],有m个请求,在s时刻从a机场起飞,在恰好t时刻到达b机场,可以净获利cc,问最大获利。
也就是说对于路线i−>j,你可以为了恰好到达而多飞一会儿。
数据保证给出的请求是合法的,即一定能从i到达j。

然后我们就可以愉快的建图跑费用流了。
把每个请求拆为两个点 x1,x2 x_1,x_2,连边 (x1,x2,1,cci) (x_1,x_2,1,cc_i),然后对于可达的两个请求x,y,连边 (x2,y1,1,−c[bx,ay]) (x_2,y_1,1,−c[b_x,a_y]),然后和源点汇点连边,即 (S,x1,1,−c[1,ax]),(x2,T,1,−c[bx,1]) (S,x_1,1,−c[1,a_x]),(x_2,T,1,−c[b_x,1]),最后汇点和超级汇点连边限制流量k。
可达性根据距离判断,由于数据保证两点之间的距离一定是最短路,所以直接判就行了。

Code:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
using namespace std;
const int N = 200*2+5;
const int INF = 0x3f3f3f3f;int n,m,S,T,SS,K,mxtim;
int t[N][N],f[N][N];struct Data{ int a,b,s,t,c; } ask[N];struct Edge{int from,to,nxt,cap,flow,cost;
} e[100005];
int head[N], ec=1;
void add(int a,int b,int cap,int cost){ec++; e[ec].cap=cap; e[ec].flow=0; e[ec].cost=cost;e[ec].from=a; e[ec].to=b; e[ec].nxt=head[a]; head[a]=ec;
}
void add2(int a,int b,int cap,int cost){add(a,b,cap,cost); add(b,a,0,-cost);
}int dis[N],pre[N]; bool vis[N];
bool spfa(){memset(dis,0x3f,sizeof(dis));memset(vis,false,sizeof(vis));queue<int> q; q.push(S); vis[S]=true; dis[S]=0; pre[S]=0;while(!q.empty()){int u=q.front(); q.pop(); vis[u]=false;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(e[i].cap>e[i].flow && dis[v]>dis[u]+e[i].cost){dis[v]=dis[u]+e[i].cost; pre[v]=i;if(!vis[v]){ vis[v]=true; q.push(v); }          }}}return dis[T]!=INF;
}int mxf(){int ans=0,a;while(spfa()){a=INF; for(int i=pre[T];i;i=pre[e[i].from]) a=min(a,e[i].cap-e[i].flow);for(int i=pre[T];i;i=pre[e[i].from]){e[i].flow+=a; e[i^1].flow-=a; ans+=a*e[i].cost;}
//      D(a); D(ans); E;}return ans;
}void build(){S=m*2+1; T=S+1; SS=S+2;for(int i=1;i<=m;i++) if(ask[i].s>=t[0][ask[i].a])add2(S,i*2-1,1,f[0][ask[i].a]);for(int i=1;i<=m;i++) if(ask[i].t+t[ask[i].b][0]<=mxtim)add2(i*2,T,1,f[ask[i].b][0]);for(int i=1;i<=m;i++) for(int j=1;j<=m;j++)if(ask[i].t+t[ask[i].b][ask[j].a]<=ask[j].s)add2(i*2,j*2-1,1,f[ask[i].b][ask[j].a]);for(int i=1;i<=m;i++) add2(i*2-1,i*2,1,-ask[i].c);add2(S,T,INF,0); add2(SS,S,K,0); swap(S,SS);
}int main(){freopen("a.in","r",stdin);scanf("%d%d%d%d",&n,&m,&K,&mxtim);for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&t[i][j]);for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&f[i][j]);for(int i=1;i<=m;i++) scanf("%d%d%d%d%d",&ask[i].a,&ask[i].b,&ask[i].s,&ask[i].t,&ask[i].c);build(); int ans=-mxf(); printf("%d\n",ans);
}

BZOJ2696: 航班安排相关推荐

  1. [国家集训队]航班安排

    题目链接:点这里 Solution: 本题首先把每个请求拆点,然后我们只需要判断时间限制,再来连边就行了 注意给出的\(f,t\)两个矩阵都是在空载情况下的定义 Code: #include<b ...

  2. [国家集训队]航班安排 (最大费用最大流)

    description 神犇航空有K架飞机,为了简化问题,我们认为每架飞机都是相同的.神犇航空的世界中有N个机场,以0-N-1编号,其中0号为基地机场,每天0时刻起飞机才可以从该机场起飞,并不晚于T时 ...

  3. 黑暗爆炸 2696. 航班安排

    链接 https://darkbzoj.tk/problem/2696 题意 神犇航空有 K K K 架飞机, N N N 个机场,以 0 ∼ N − 1 0\sim N−1 0∼N−1 编号,其中 ...

  4. BZOJ 2696 航班安排 费用流

    题目大意:K架飞机,N个机场,以0..N-1编号,其中0号为基地机场,每天0时刻起飞机从该机场起飞,并不晚于T时刻回到该机场.M个包机请求,每个请求为在s时刻从a机场起飞,在恰好t时刻到达b机场,可以 ...

  5. asp毕业设计——基于asp+access的航班在线定票系统设计与实现(毕业论文+程序源码)——航班在线定票系统

    基于asp+access的航班在线定票系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的航班在线定票系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  6. 信息系统分析与设计 机票预定管理系统

    系统规划 1.1系统开发背景 随着人均收入水平的提高,人们出行的方式也变得多种多样,更多的人会选择节约时间的飞机出行,因此航班数和飞机数量也就随之增加.为了增强用户的购票体验,需要一种如本实验所做的机 ...

  7. 航空器滑行时间预测研究(一)---定义及影响因素

    写在前面:hello everybody, welcome back to my channel!!!哈哈哈又来写博客了,其实距离上一篇博客的发布已经快一年的时间了,本来这篇博客是想跟大家介绍一下宏观 ...

  8. 基于小波分解与LSTM的城市轨道短时客流预测

    1.文章信息 文章题为<A novel prediction model for the inbound passenger flow of urban rail transit>,是一篇 ...

  9. UML类图和用例图练习

    一.问题描述 一个公司可以雇佣多个人,某个人在同一时刻只能为一家公司服务.每个公司只有一个总经理,总经理下有多个部门经理管理公司的雇员,公司的雇员只归一个经理管理.请为上面描述的关系建立类模型,注意捕 ...

最新文章

  1. Gameplay 框架
  2. 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
  3. mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表
  4. WebKit 与 V8 的关系
  5. 自动化软件部署的shell脚本
  6. 基于密度的停留点识别方法
  7. Git的使用教程(二)
  8. MySQL 优化之 EXPLAIN 关键字
  9. Verizon:2013年数据破坏调查报告(DBIR)【更新版】
  10. Spring Cloud(Greenwich版)-02-服务注册与服务发现-Eureka入门
  11. 《工业设计史》 第二章:手工艺设计阶段
  12. 商家APP店内点餐开启有桌台点餐模式
  13. linux下安装postgresql遇到的问题(zlib library not found,readline library not found)
  14. app防止被抓包,包括Fiddler,Charles,HttpCanary等工具
  15. Word插入页码简单方法
  16. 密码学常用工具,作图
  17. Mac安装redis并设置开机自启动
  18. R语言survival包的survfit函数拟合生存曲线数据、survminer包的ggsurvplot函数可视化生存曲线、绘制分面生存曲线(facet_grid)
  19. js实现彩票机选效果
  20. 硬件设计——关于电路设计的一些知识

热门文章

  1. yolo3训练时的问题
  2. 60万想在广州买房,真的是太难了!
  3. 全球及中国料理机市场盈利前景与产销规模调研报告2022版
  4. Visual Studio 2010 打开时提示“遇到了问题,需要关闭”的解决办法
  5. 数字货币支付和电子支付一样吗?
  6. Matlab 之灰色预测模型GM(1,1)和GM(1,n)
  7. 零基础入门PostgreSQL
  8. vue项目打包部署后中文乱码
  9. android模拟器一直显示启动中,蓝手指安卓模拟器(BlueStacks)一直显示“启动中”如何解决?...
  10. 数字援藏:像拼积木一样用低代码编程序