【GDOI2016模拟4.23】飞机调度

Descriptoin

给出n个机场和m个航班,第i个航班需要在di这个时间点从机场xi飞到yi。
从x飞到y的时间为T[x,y],T[x,y]不一定等于T[y,x]。
在第i个机场降落的飞机都需要准备pi的时间才能再次起飞。
时刻0你可以在任意机场安排任意架准备好的飞机。
问最少需要准备多少架飞机。
n,m<=500

Solution

刚看到这一题,首先想到先用Floyd求出到每个机场的最短路。
n<=500,似乎会炸。
别胆怯!只要你不用min(渣渣algorithm)
然后,如果一架飞机可以在飞完航班i之后飞航班j,那么我们从i向j连一条有向边。
答案是什么?
最小路径覆盖!
然后就考验你的打题姿势了。
反正我dinic跑不过……

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a) for(int i=last[a];i;i=next[i])
#define N 505
using namespace std;
int t[N*N],next[N*N],v[N*N],last[N],dis[N][N],time[N][N];
int n,m,l,id,S,T,ans,x[N],y[N],d[N],f[N],bz[N],q[N],c[N];
void add(int x,int y) {
    t[++l]=y;next[l]=last[x];last[x]=l;
}
int find(int x) {
    rep(i,x) if (!bz[t[i]]) {
        bz[t[i]]=1;
        if (!f[t[i]]||find(f[t[i]])) {
            f[t[i]]=x;
            return 1;
        }
    }
    return 0;
}
int main() {
    freopen("flight.in","r",stdin);
    freopen("flight.out","w",stdout);
    scanf("%d%d",&n,&m);S=0;l=1;T=2*m+1;ans=m;
    fo(i,1,n) scanf("%d",&c[i]);
    fo(i,1,n) fo(j,1,n) {
        scanf("%d",&time[i][j]);
        if (i!=j) dis[i][j]=time[i][j]+c[j];
        else dis[i][j]=time[i][j];
    }
    fo(k,1,n) 
        fo(i,1,n)
            if (i!=k)
                fo(j,1,n)
                    if (i!=j&&j!=k&&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",&x[i],&y[i],&d[i]);
        fo(j,1,i-1) {
            if (d[j]+time[x[j]][y[j]]+c[y[j]]+dis[y[j]][x[i]]<=d[i]) add(j,i);
            if (d[i]+time[x[i]][y[i]]+c[y[i]]+dis[y[i]][x[j]]<=d[j]) add(i,j);
        }
    }
    fo(i,1,m) memset(bz,0,sizeof(bz)),ans-=find(i);
    printf("%d",ans);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值