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;
}