1. 程式人生 > >BZOJ 1395 [Baltic2005]Trip(最短路+DP)

BZOJ 1395 [Baltic2005]Trip(最短路+DP)

www clu ++ == break can algo targe pre

【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1354

【題目大意】

  給出一些車的班次,包括起點,終點,到達起點時間區間,
  到達終點時間區間,想要T時刻到達n號點,問最壞情況下的最短等待時間

【題解】

  最壞情況就是每次從b時刻才出發,c時刻到達,
  那麽就相當於地點從x到y,時間從a到d,代價為c-b,
  我們求出符合要求的最大代價,然後用最終時間T去減即可
  如果沒有a和d這個限制,可以直接求最長路即可,
  現在考慮如何消除a和d這個時間限制,我們將每條路拆分為兩個點


  a點處理答案保存,d點處理最長路的計算,
  按照時間節點排序,順序求最長路即可。  

【代碼】

#include <cstdio>
#include <algorithm>
#include <cstring> 
using namespace std;
const int N=50010;
int n,m,T,t,x,y,a,b,c,d,tot,dis[N],ans[N<<1];
struct ask{int x,t,id,dis;}q[N<<2];
bool cmp(ask a,ask b){return a.t==b.t?a.dis>b.dis:a.t<b.t;}
int main(){
    scanf("%d%d%d%d",&n,&m,&T,&t);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d%d%d%d",&x,&y,&a,&b,&c,&d);
        q[++tot]=(ask){x,a,i,0};
        q[++tot]=(ask){y,d,i,c-b};
    }q[++tot]=(ask){n+1,t,0,-2e9};
    sort(q+1,q+tot+1,cmp);
    memset(dis,233,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=tot;i++){
        if(q[i].x==n+1)break;
        if(!q[i].dis)ans[q[i].id]=dis[q[i].x];
        else dis[q[i].x]=max(dis[q[i].x],ans[q[i].id]+q[i].dis);
    }printf("%d\n",dis[T]<0?-1:t-dis[T]);
    return 0;
}

BZOJ 1395 [Baltic2005]Trip(最短路+DP)