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. 特性总览:核心特性、数据存储、Web技术、框架整合与测试
  2. 通过wifi调试Android程序
  3. 饥饿的盛世读后感_满足任何设计师饥饿感的原型制作工具
  4. python函数做n_简单Python函数的O(N)时间复杂性
  5. VS2010生成的文件在别的机器上运行提示“丢失MSVCR100D.dll”
  6. linux自学笔记--vim和文本三剑客基础
  7. .NET BackgroundWorker的一般使用方式
  8. 麒麟9000芯片的库存真就是个迷
  9. Spring之注入集合值
  10. Please select Android SDK的解决
  11. 安装allennlp库
  12. tushare基本用法
  13. Python调用OpenCV实现图像反色(反相)处理
  14. 今日小程序推荐:文艺青年必备「轻芒杂志」
  15. 计算机冯诺伊曼体系结构和哈佛体系结构区别和处理器性能评判标准
  16. 【linux】 下根目录,家目录区别
  17. Python之排序函数总结
  18. hibernate 乐观锁
  19. DeepbrainChain2021年末週报
  20. 【数据库】对不起navicat我投入了DataGrip的怀抱

热门文章

  1. 互联网早报 | 滴滴推出百亿补贴活动;阿里巴巴三总部三中心落户上海;美团点评正式更名为“美团”...
  2. linux待机后视频声音有电流声-解决方法
  3. 搭建管理驾驶舱--以结果倒逼过程管理
  4. 显著性检测大牛或实验室的主页
  5. 会的多和会的精,你会选哪个
  6. [电动智能汽车-4]:原理 - 高压电源系统与互锁系统
  7. Python中numpy的综合练习
  8. 霍炬: 回应破破的桥《针对OpenSSL捐助的讨论》
  9. 74HC595扩展IO芯片的使用以及例程(74HC595A和75HC595D的区别)
  10. 艾默生流量计重油流量计的测量原理和优势