Description

作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了。你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续不停地飞不同的航线,甚至有的时候为了能够完成飞机的调度,航空公司还会增开一些临时航线——在飞机转场的同时顺路捎一些乘客。你研究了一下GDOI著名航空公司GD Airways的常规直飞航线,你想知道,在最佳调度方案下,GD Airways最少需要多少架飞机才能成功执飞这所有的航线。
GDOI王国里有N个机场,编号为1到N。从i号机场到j号机场需要飞行Ti,j的时间。由于风向,地理位置和航空管制的因素,Ti,j和Tj,i并不一定相同。
此外,由于飞机降落之后需要例行维修和加油。当一架飞机降落k号机场时,需要花费Pk的维护时间才能再次起飞。
GD Airways一共运营M条航线,其中第i条直飞航线需要在Di时刻从Xi机场起飞,不经停,飞往Yi机场。
为了简化问题,我们假设GD Airways可以在0时刻在任意机场任意多架加油维护完毕的飞机;为了减少飞机的使用数,我们允许GD Airways增开任意多条临时航线以满足飞机的调度需要。
你想知道,理论上GD Airways最少需要多少架飞机才能完成所有这M个航班。

Input

从文件flight.in中读入数据。
输入一行包含两个正整数N和M。
接下来一行包含N个正整数表示每一个机场的飞机维护时间。
接下来N行,每行N个非负整数,其中第i行第j个非负整数为Ti,j,表示从第i号机场飞往j号机场所需要花费的时间。数据保证Ti,i=0。
接下来M行,每行3个正整数,其中第i行为Xi,Yi,Di,表示第i条航线的起飞机场,降落机场,以及起飞时间。数据保证Xi≠Yi。

Output

输出到文件flight.out中。
输出文件包含一行一个正整数,表示GD Airways理论上最少需要的飞机数。

Sample Input

样例输入1:
3 3
100 1 1
0 1 1
1 0 5
2 1 0
1 2 1
2 1 1
3 1 9
样例输入2:
3 3
100 1 1
0 1 1
1 0 5
2 1 0
1 2 1
2 1 1
3 1 8

Sample Output

样例输出1:
2
样例输出2:
3

Data Constraint

对于30%的数据满足N,M<=10;
对于60%的数据满足N,M<=100;
对于100%的数据满足1<=N,M<=500,0<=Pi,Ti,j<=106,1<=Di<=106。

Hint

在第一个样例中,GD Airways可以在0时刻在2号机场安排一架飞机并执飞第2条航线(2–>1)。此外还需要在0时刻在1号机场安排一架飞机,这架飞机首先执飞第1条航线(1–>2),然后通过临时新增一条航线从2号机场起飞飞往3号机场,降落3号机场之后执飞第3条航线(3–>1)。
在第二个样例中,执行完第1条航线的飞机无法赶上第3条航线的起飞时间,因此GD Airways必须使用3架不同的飞机才能完成所有的航班。

Solution

这题看很神奇。
首先我想到了DP。仔细想一想,发现根本无法推出状态转移方程。
接着我想到了网络流,然后发现……
由题意可知,如果一个航班飞完了这个航线,要飞下一条航线,必须要在那班航班开始前到大那个机场并加油完。也就是说飞机不能晚点。
那么一架飞机飞完一条航线后到达下一个航线的起点位置不需要直飞,就用一个Floyd求出最短路。然而飞机到达机场需要修理,可以吧修理的时间算在路线长度内,就不需要再判断了。
如果一个航线的终点ti飞到另一个航线的起点sj,并且可以再时间内的话,就把i与j连边。那么要使所需飞机最少,就是要在图中求最小路径覆盖。
最小路径覆盖用二分图匹配就行了。(匈牙利算法)
注意:飞航线必须直飞,而从一个终点飞到另一个起点要最短路。

code

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iostream>
#define N 510
#define MAX 21474836
#define fo(i,a,b) for(int i=a;i<=b;i++)
int map[N][N],a[N][N],p[N],h[N],n,m,last[N],next[N*1000],to[N*1000],b[N],tot=0,st,bz[N];
struct note
{int s,t,d;
};
note f[N];
using namespace std;
void putin(int x,int y)
{next[++tot]=last[x];last[x]=tot;to[tot]=y;
}
bool dg(int x)
{if (bz[x]==st) return 0;bz[x]=st;for(int i=last[x];i;i=next[i]){int y=to[i];if (b[y]==0 || dg(b[y])){b[y]=x;return 1;}}return 0;
}
int main()
{freopen("flight.in","r",stdin);freopen("flight.out","w",stdout);scanf("%d%d",&n,&m);fo(i,1,n) scanf("%d",&p[i]);fo(i,1,n) fo(j,1,n) {scanf("%d",&map[i][j]);if (i!=j) a[i][j]=map[i][j]+=p[j];}fo(i,1,m) scanf("%d%d%d",&f[i].s,&f[i].t,&f[i].d);fo(k,1,n)fo(i,1,n)fo(j,1,n)if (i!=j && a[i][j]>a[i][k]+a[k][j]){a[i][j]=a[i][k]+a[k][j];}fo(i,1,m)fo(j,1,m)if (i!=j && f[i].d+map[f[i].s][f[i].t]+a[f[i].t][f[j].s]<=f[j].d){putin(i,j);}int ans=m;for(st=1;st<=m;st++) if (dg(st)) ans--;printf("%d",ans);fclose(stdin);fclose(stdout);
}

【GDOI2016模拟4.22】飞机调度相关推荐

  1. JZOJ 4467【GDOI2016模拟4.22】数字方阵

    Description Anica 做了一个很奇怪的梦:她梦见了一个无限大的平板,平板上填着无限行和无限列的整数.有趣的是,每个整数在那神奇的平板上只出现有限的次数. 机智的Anica很快便发现了这其 ...

  2. 【GDOI2016模拟4.22】总结

    前言 早上,一进机房,发现所有人神情严肃,一股(\(da\))(\(ba\))场的气氛迎面扑来,我一下子意识到:nothing good! 这场比赛结果不是很好,50分: 第一题:感觉上是个神奇的匹配 ...

  3. Echarts模拟迁徙之飞机变小车

    Echarts模拟迁徙之飞机变小车 小车样式 小车路径 在模型迁徙代码块中位置 Echarts中所有代码 最终效果 小车样式 小车样式通过AI(Adobe Illustrator)软件设计完成 小车路 ...

  4. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)

    [GDOI2016模拟3.16]幂 \(X\in[1,A],Y\in[1,B]\),问:\(x^y\)的不用取值个数. \(A,B\)都是\(10^9\)级别. 然后我们开搞. 首先,假设一个合法的\ ...

  5. JZOJ 6481. 【GDOI2020模拟02.22】黎曼几何(矩阵乘法)

    JZOJ 6481. [GDOI2020模拟02.22]黎曼几何 题解 设fn,1f_{n,1}fn,1​和fn,2f_{n,2}fn,2​分别表示将nnn个硬币移动111格和222格的最小步数, 推 ...

  6. 【GDOI2016模拟4.23】飞机调度

    Descriptoin 给出n个机场和m个航班,第i个航班需要在di这个时间点从机场xi飞到yi. 从x飞到y的时间为T[x,y],T[x,y]不一定等于T[y,x]. 在第i个机场降落的飞机都需要准 ...

  7. 【GDOI模拟】飞机调度

    Description 作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了.你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续 ...

  8. 【JSOI2016】飞机调度

    Description 作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了.你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续 ...

  9. 计算机仿真模拟在装配,飞机装配仿真中数字人模型及工人姿态的模拟

    飞机装配仿真中数字人模型及工人姿态的模拟 由于飞机的结构及其制造工艺复杂,制造过程中的工艺性问题和人机问题时有发生.采用数字人和计算机仿真技术,模拟飞机制造中工人的作业姿势,为在生产准备阶段提前发现这 ...

最新文章

  1. sql server优化策略
  2. python PyQt5 QSplitter类(可拉伸区域分隔器)
  3. oracle中的mount是什么意思,oraclenomountmountopen直接的关系
  4. 基于墨刀实现的短视频分享软件原型设计
  5. 高等数学中▽符号的作用
  6. 智慧社区智能化管理系统搭建
  7. 用友适合套打的打印机所有型号和问题
  8. 计算机二级知识普及挑战赛答案,全国计算机二级试题库
  9. xp系统怎么关闭wmi服务器,WinXP系统如何启用WMI服务,教您WinXP系统如何启用WMI服务...
  10. canvas 实现截图功能——截取图片的一部分
  11. x86 单线并发多拨_【转帖】适用所有CC版的 openwrt 单线并发多拨教程!!!
  12. react 中 Warning A future version of React will block javascript 异常解决
  13. 苹果吃鸡蓝牙耳机推荐哪个?性价比高的游戏蓝牙耳机推荐
  14. 关于笔记本电池显示未充电的
  15. Android 文件中断续传
  16. MySQL 分库拆表方案
  17. 关于一款心理辅导机器人的调研(Woebot)
  18. 我见过的最脑残也是最好懂的人工神经网络算法教程
  19. python调用google translate API(谷歌翻译) 的使用方法-手动构造HTTP 请求模式
  20. Photoshop开门十件事。

热门文章

  1. 小程序获取手机号验证码
  2. 美团的系统是如何记录操作日志?
  3. springBoot前后端不分离Vue+elementUI脚手架
  4. LoRaWAN介绍8 QoS
  5. html的em标签不用斜体,HTML元素em标签的使用方法及作用
  6. 天线巴伦制作和原理_巴伦制作方法
  7. 美国SigmasTek泰克蓄电池特点-VRLA蓄电池及其应用
  8. 基于ssm+vue的消防物资仓库出入库管理系统
  9. 解题-->在线OJ(十二)
  10. 软件测试课堂练习题答案 中国大学mooc