【GDOI2016模拟4.23】飞机调度
2016-04-26 19:08
288 查看
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 ,y ,d ,f ,bz ,q ,c ; 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); }
相关文章推荐
- I2C总线协议
- MySQL Binlog Mixed模式记录成Row格式
- JAVA发送邮件最全示例
- 文章标题
- 数组的初始化问题
- springmvc restful put delete Ajax 请求参数取不到-已解决
- java编程中'为了性能'一些尽量做到的地方
- [省选] [线段树] [BZOJ1012] JSOI2008 最大值 (max)
- 移动端 顶部、底部和内容之间的小技巧 用flex布局来解决
- iOS -UITableView-FDTemplateLayoutCell 的使用
- cf655A Buses Between Cities
- 内存泄漏与内存溢出(简单总结)
- Android bind service讲解以及跨进程通信
- hdu 4707 Pet【带权并查集】
- Android开发艺术探索——第四章View的工作原理
- PAT-B 1001. 害死人不偿命的(3n+1)猜想
- hdu-3943[数位dp(记忆化搜索)+二分]
- 实践--天气预报应用实例
- 利用Charles抓https包
- initcall在内核中的调用顺序