Layout(POJ No.3169)
POJ 3169
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 10005
#define _for(i, a) for(int i = 0; i < (a); i++)
#define _rep(i, a, b) for(int i = (a); i <= (b); i++)
#define INF 0x3f3f3f3f
int N, ML, MD;
int AL[ maxn] , BL[ maxn] , DL[ maxn] ;
int AD[ maxn] , BD[ maxn] , DD[ maxn] ;
int d[ maxn] ;
void solve ( ) {
fill ( d, d + N, INF) ;
d[ 0 ] = 0 ;
_for ( k, N) {
for ( int i = 0 ; i + 1 < N; i++ ) {
if ( d[ i + 1 ] < INF) d[ i] = min ( d[ i] , d[ i + 1 ] ) ;
}
_for ( i, ML) {
if ( d[ AL[ i] - 1 ] < INF) {
d[ BL[ i] - 1 ] = min ( d[ BL[ i] - 1 ] , d[ AL[ i] - 1 ] + DL[ i] ) ;
}
}
_for ( i, MD) {
if ( d[ BL[ i] - 1 ] < INF) {
d[ AD[ i] - 1 ] = min ( d[ AD[ i] - 1 ] , d[ BD[ i] - 1 ] - DD[ i] ) ;
}
}
}
int res = d[ N - 1 ] ;
if ( d[ 0 ] < 0 ) {
res = - 1 ;
}
else if ( res == INF) {
res = - 2 ;
}
printf ( "%d\n" , res) ;
}
int main ( ) {
cin >> N >> ML >> MD;
_for ( i, ML) cin >> AL[ i] >> BL[ i] >> DL[ i] ;
_for ( i, MD) cin >> AD[ i] >> BD[ i] >> DD[ i] ;
solve ( ) ;
return 0 ;
}