刷题——Layout POJ

来源:互联网 发布:matlab画图编程例题 编辑:程序博客网 时间:2024/06/06 02:12
/*
一堆牛从1开始按序号排成一排,
有一些牛之间有最大距离,有一些之间有最小距离,牛可以挤在一起,即距离可以为0
问,牛1到牛n的距离的最大距离
则,设d[]为牛1到各牛的距离,由上述条件可得
d[i+1]-d[i]>=0
d[BL[i]]-d[AL[i]]<=DL[i]
d[AD[i]]-d[BD[i]]>=DD[i]
d[N]=d[N]-d[N-1]+d[N-2]-d[N-2]+......+d[2]-d[1]
d[N]:MAX=MAX(d[N-1]-d[N])+......+MAX(d[2]-d[1])
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
#define INF 2*1e8
int N,ML,MD;
int AL[10005],BL[10005],DL[10005];
int AD[10005],BD[10005],DD[10005];
int d[1005];
void solve(){
    fill(d+1,d+N+1,INF);
    d[1]=0;
    for(int k=0;k<N;k++){
        for(int i=1;i+1<=N;i++){
            if(d[i+1]!=INF)d[i]=min(d[i],d[i+1]);
        }
        for(int i=0;i<ML;i++){
            if(d[AL[i]]!=INF)d[BL[i]]=min(d[BL[i]],d[AL[i]]+DL[i]);
        }
        for(int i=0;i<MD;i++){
            if(d[BD[i]]!=INF)d[AD[i]]=min(d[AD[i]],d[BD[i]]-DD[i]);
        }
    }
    if(d[1]<0)printf("-1\n");
    else if(d[N]==INF)printf("-2\n");
    else printf("%d\n",d[N]);
}
int main(){
    while(~scanf("%d %d %d",&N,&ML,&MD)){
        for(int i=0;i<ML;i++){
            scanf("%d %d %d",&AL[i],&BL[i],&DL[i]);
        }
        for(int i=0;i<MD;i++){
            scanf("%d %d %d",&AD[i],&BD[i],&DD[i]);
        }
        solve();
    }
    return 0;
}