飞机调度
来源:互联网 发布:爱卿网络 编辑:程序博客网 时间:2024/06/02 15:48
Description
作为一个旅行达人以及航空公司的金卡会员,你每一年的飞行里程可以绕赤道几周了。你发现,航空公司为了提高飞机的使用率,并不是简单的一条航线使用一架飞机来回飞,而是会让同一架飞机连续不停地飞不同的航线,甚至有的时候为了能够完成飞机的调度,航空公司还会增开一些临时航线——在飞机转场的同时顺路捎一些乘客。你研究了一下GDOI著名航空公司GD Airways的常规直飞航线,你想知道,在最佳调度方案下,GD Airways最少需要多少架飞机才能成功执飞这所有的航线。
GDOI王国里有N个机场,编号为1到N。从i号机场到j号机场需要飞行
Ti,j 的时间。由于风向,地理位置和航空管制的因素,Ti,j 和Tj,i 并不一定相同。此外,由于飞机降落之后需要例行维修和加油。当一架飞机降落
k 号机场时,需要花费P[k] 的维护时间才能再次起飞。GD Airways一共运营
M 条航线,其中第i条直飞航线需要在Di时刻从Xi 机场起飞,不经停,飞往Yi 机场。为了简化问题,我们假设GD Airways可以在
0 时刻在任意机场任意多架加油维护完毕的飞机;为了减少飞机的使用数,我们允许GD Airways增开任意多条临时航线以满足飞机的调度需要。你想知道,理论上GD Airways最少需要多少架飞机才能完成所有这
M 个航班。
Solution
维护时间只和降落的机场有关,所以我们可以直接把它加入飞行时间内
然而我们可以发现,直飞并不一定耗费最短时间,所以我们还需要做一遍最短路(这里推荐大家打Floyd,SPFA跑完全图嘛……,Floyd跑我就是被坑了)
特别提醒:一开始给定你的航线是不可以走最短路的,因为
第i条直飞航线需要在Di时刻从
Xi 机场起飞,不经停
不经停!
这坑倒了无数人,包括我
继续
我们可以把每个航班拆成两个点,分别是出发和到达
点上记录时刻和所在机场。
我们把到达的点和出发的点分别存在两个数组中
对于每一个到达点
把所有
其中
那么我们可以得到一个二分图,跑一遍最大匹配即可(建议打匈牙利)
不会匈牙利的戳这里
http://blog.csdn.net/hzj1054689699/article/details/51035647
这是经典的路径覆盖问题
Code
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;struct note{ int x,y,z;};bool cmp(note x,note y){ return x.y<y.y;}int dis[505][505],wh[501],map[505][505],n,m,a[505][505],dt[5005];bool bz[505];note l[505],r[505];bool find(int k){ int i; fo(i,1,a[k][0]) { int p=a[k][i]; if (bz[p]==0) { bz[p]=1; if (dt[p]==0||find(dt[p])) { dt[p]=k; return 1; } } } return 0;}int main(){ freopen("flight.in","r",stdin); freopen("flight.out","w",stdout); scanf("%d%d",&n,&m); int i,j,k; fo(i,1,n) { scanf("%d",&wh[i]); } fo(i,1,n) { fo(j,1,n) { scanf("%d",&map[i][j]); if (i!=j) map[i][j]+=wh[j]; dis[i][j]=map[i][j]; } } fo(k,1,n) fo(i,1,n) fo(j,1,n) if (dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; fo(i,1,m) { scanf("%d%d%d",&r[i].x,&l[i].x,&r[i].y); l[i].y=r[i].y+map[r[i].x][l[i].x]; l[i].z=r[i].z=i; } sort(l+1,l+m+1,cmp); sort(r+1,r+m+1,cmp); fo(i,1,m) { fo(j,1,m) { if (l[i].z!=r[j].z&&l[i].y+dis[l[i].x][r[j].x]<=r[j].y) { a[i][++a[i][0]]=j; } } } memset(dt,0,sizeof(dt)); int ans=m; fo(i,1,m) { memset(bz,0,sizeof(bz)); if (find(i)) ans--; } cout<<ans;}
- 飞机调度
- [JZOJ4465][JSOI2016?]飞机调度
- 【JSOI2016】飞机调度
- [JSOI2016]飞机调度
- 【GDOI模拟】飞机调度
- 例题5.9 飞机调度 LA3211
- 【GDOI2016模拟4.22】飞机调度
- 【GDOI2016模拟4.23】飞机调度
- UVA 1146 飞机调度 2-SAT问题
- JZOJ 4465【GDOI2016模拟4.22】飞机调度
- 线性规划之飞机航班调度问题
- UVA Live 3211飞机调度问题-二分+2-SAT
- uva1146Now or later飞机调度【2-SAT】入门题
- 飞机调度(Now or later,LA 3211)
- JZOJ.4465[GDOI2016模拟4.22] 飞机调度 解题报告
- 2-SAT问题(飞机调度,LA 3211)
- 飞机
- 飞机
- return 、 return false、return true区别
- hadoop学习序曲之java基础篇--javaIO流及File类
- hdoj 2111 Saving HDU
- javascript语言两种变量类型及存储方式
- 测试mysql单表排序是否有走索引
- 飞机调度
- dubbo源码分析-consumer端5-Filter
- 关于毕设中使用hibernate的多条件模糊查询出现的还没有解决的bug的记录
- Linux yum 软件安装
- synchronized使用
- 有关Java链表概念的有趣问题
- javascript笔记总结一
- mysql表导出导入测试(utf8-utf8)
- 强联通分量简讲(Tarjan算法)&&HDU 1269 迷宫城堡