【JSOI2016】飞机调度
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】飞机调度相关推荐
- [JZOJ4465][JSOI2016?]飞机调度
题目大意 有nn个城市,两两飞行时间为ti,jt_{i,j}(ti,jt_{i,j}不一定等于tj,it_{j,i},保证ti,i=0t_{i,i}=0). mm条商务航线,要求在时刻DiD_i从城市 ...
- 【GDOI模拟】飞机调度
Description 作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了.你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续 ...
- 【GDOI2016模拟4.22】飞机调度
Description 作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了.你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续 ...
- 【GDOI2016模拟4.23】飞机调度
Descriptoin 给出n个机场和m个航班,第i个航班需要在di这个时间点从机场xi飞到yi. 从x飞到y的时间为T[x,y],T[x,y]不一定等于T[y,x]. 在第i个机场降落的飞机都需要准 ...
- 【车间调度】基于改进蛙跳算法求解车间调度问题
作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加 ...
- 【车间调度】基于matlab NSGA2算法求解车间调度优化问题【含Matlab源码 2418期】
⛄一.车间调度简介 1 作业车间调度问题描述 作业车间调度问题(Job Shop Scheduling, JSP)是最经典的几个NP-hard问题之一.其应用领域极其广泛,涉及航母调度,机场飞机调度, ...
- IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
近日,国际人工智能联合会议(International Joint Conference on Artificial Intelligence)公布了比赛议程,其中,由第四范式.巴黎萨克雷大学.香港科 ...
- 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)
本节内容-- 2-SAT dijstra算法的一些应用 SPFA算法的一些应用 例题9 飞机调度 有n架飞机需要着陆.每架飞机都可以选择"早着陆"和"晚着陆"两 ...
- 基于SSM生产计划排程管理系统
项目下载地址:https://download.csdn.net/download/qq_36388734/11390210 ** 欢迎下载 ** 第1章作业车间调度问题 1.1问题的描述 作业车间调 ...
最新文章
- Word中的自定义编号详解及疑难汇总!
- C# 8.0 中开启默认接口实现
- linux下设置opencv环境变量
- Linux卸载系统盘,Linux磁盘管理(创建、卸载、挂载磁盘)
- 腾讯云服务器架设mir2
- CentOS的下载与安装
- Attention-GAN
- Windows 无法连接到打印机.打印后台程序服务没有运行
- 银川清华计算机技术培训,银川有没有本地IT技能培训?
- Vulkan的基本概念:如何使用Vulkan绘制三角形?
- Java函数式编程学习——Stream流
- 写出计算机的主要应用,计算机的主要用途是什么?
- SQLServer各个版本之间的差异
- GDUT - 专题学习1 C - 马走日
- [HIMCM暑期班]第1课:概述
- 零件名词解释_最珍贵的机械英语及名词解释大全
- 沈阳计算机专业四年制免考,【图片】【2020新生答疑】计算机学院我院目前设有以下专业1.计算机科学与技术2.软件工程3.网络工程4.物联网工程【沈阳航空航天大学吧】_百度贴吧...
- 文本数据增强-同义词替换、随机交换、随机插入、随机删除
- 卡农D大调(钢琴版)
- Ubuntu安装webmin,并更改为中文界面