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。

分析

//比赛时思路想出来了,但是最小路径覆盖这一块脑抽了,没打匈牙利。。。

如果每个机场每个时间都建一个点,那么复杂度很大。
但是我们发现,按照上面的方法建出来的点,有很多都是没用的。
如果我们对于M个航班来建点呢?

每个航班可以拆成两个点,然后对于一个航班的终点,枚举另一个航班的起点,如果能在规定时间内到达就连一条边。这个可以给原图做一遍弗洛伊德得出(注意有n^2条边,跑Dij或spfa就是作死)。还有就是用if语句代替min,min()常数大。

这样就可以把问题转换为最小路径覆盖,用匈牙利算法解决!

注意细节

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;typedef long long LL;int n,m,cnt,tot,I,X[505],Y[505],D[505],dis[505][505],d[505][505],v[505],ans,f[505],visit[505];bool g[505][505];bool check(int x)
{
    if (visit[x]==I) return 0;
    visit[x]=I;
    for (int i=1;i<=m;i++) if (g[x][i] && (!f[i] || check(f[i])))
    {        f[i]=x; return 1;
    }
    return 0;
}int main()
{
    freopen("flight.in","r",stdin); freopen("flight.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&v[i]);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
        {            scanf("%d",&d[i][j]);
            if (i!=j) dis[i][j]=d[i][j]+v[j];
        }
    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++) if (i!=k)
            for (int j=1;j<=n;j++)
                if (dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
    for (int i=1;i<=m;i++) scanf("%d%d%d",&X[i],&Y[i],&D[i]);
    for (int i=1;i<=m;i++)
        for (int j=1;j<=m;j++) if (i!=j && dis[Y[i]][X[j]]+D[i]+d[X[i]][Y[i]]+v[Y[i]]<=D[j])
            g[i][j]=1;
    for (I=1;I<=m;I++) ans+=check(I);
    printf("%d\n",m-ans);
    fclose(stdin); fclose(stdout);
    return 0;
}

【JSOI2016】飞机调度相关推荐

  1. [JZOJ4465][JSOI2016?]飞机调度

    题目大意 有nn个城市,两两飞行时间为ti,jt_{i,j}(ti,jt_{i,j}不一定等于tj,it_{j,i},保证ti,i=0t_{i,i}=0). mm条商务航线,要求在时刻DiD_i从城市 ...

  2. 【GDOI模拟】飞机调度

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

  3. 【GDOI2016模拟4.22】飞机调度

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

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

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

  5. 【车间调度】基于改进蛙跳算法求解车间调度问题

    作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加 ...

  6. 【车间调度】基于matlab NSGA2算法求解车间调度优化问题【含Matlab源码 2418期】

    ⛄一.车间调度简介 1 作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度, ...

  7. IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛

    近日,国际人工智能联合会议(International Joint Conference on Artificial Intelligence)公布了比赛议程,其中,由第四范式.巴黎萨克雷大学.香港科 ...

  8. 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)

    本节内容-- 2-SAT dijstra算法的一些应用 SPFA算法的一些应用 例题9 飞机调度 有n架飞机需要着陆.每架飞机都可以选择"早着陆"和"晚着陆"两 ...

  9. 基于SSM生产计划排程管理系统

    项目下载地址:https://download.csdn.net/download/qq_36388734/11390210 ** 欢迎下载 ** 第1章作业车间调度问题 1.1问题的描述 作业车间调 ...

最新文章

  1. Word中的自定义编号详解及疑难汇总!
  2. C# 8.0 中开启默认接口实现
  3. linux下设置opencv环境变量
  4. Linux卸载系统盘,Linux磁盘管理(创建、卸载、挂载磁盘)
  5. 腾讯云服务器架设mir2
  6. CentOS的下载与安装
  7. Attention-GAN
  8. Windows 无法连接到打印机.打印后台程序服务没有运行
  9. 银川清华计算机技术培训,银川有没有本地IT技能培训?
  10. Vulkan的基本概念:如何使用Vulkan绘制三角形?
  11. Java函数式编程学习——Stream流
  12. 写出计算机的主要应用,计算机的主要用途是什么?
  13. SQLServer各个版本之间的差异
  14. GDUT - 专题学习1 C - 马走日
  15. [HIMCM暑期班]第1课:概述
  16. 零件名词解释_最珍贵的机械英语及名词解释大全
  17. 沈阳计算机专业四年制免考,【图片】【2020新生答疑】计算机学院我院目前设有以下专业1.计算机科学与技术2.软件工程3.网络工程4.物联网工程【沈阳航空航天大学吧】_百度贴吧...
  18. 文本数据增强-同义词替换、随机交换、随机插入、随机删除
  19. 卡农D大调(钢琴版)
  20. Ubuntu安装webmin,并更改为中文界面

热门文章

  1. 外贸Soho创业之前期要做哪些准备,要不要全职开始创业
  2. 2021年1月北京市各区租房性价比说明--数据来源(链家)
  3. CobalStrike(CS)上线隐藏IP和流量
  4. VRTRIX数据手套的配置以及在Unity3D场景下的多种交互实现
  5. IoT物联网设备丢消息问题排查指南
  6. xee mac版有哪些功能?
  7. 热输运物性的理论计算方法
  8. C++pari的用法
  9. EAS BOS开发入门案例 采购订货
  10. Qt之QComboBox 解决下拉列表样式不生效、item文字重叠