RT 代码如下
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 1000 + 10, MAXM = 20000 + 10;
LL val[MAXM], dis[MAXN];
int nxt[MAXM], to[MAXM], head[MAXN], num[MAXN];
int n, ML, MD, cnt = 0;
bool vis[MAXN];
void inline add(int x, int y, int w) {
to[++ cnt] = y; val[cnt] = w;
nxt[cnt] = head[x]; head[x] = cnt;
}
void inline spfa(int s) {
queue <int> q; q.push(s);
dis[s] = 0; vis[s] = false;
while (!q.empty()) {
int x = q.front(); q.pop(); vis[x] = false;
for(register int i = head[x]; i; i = nxt[i]) {
int y = to[i];
if(dis[y] > dis[x] + val[i]) {
dis[y] = dis[x] + val[i];
num[y] = num[x] + 1;
if(num[y] > n) {printf("-1\n"); exit(0);}
if(!vis[y]) {q.push(y); vis[y] = true;}
}
}
}
}
void inline clean () {
memset(vis, false, sizeof(vis));
memset(dis, 0x3f, sizeof(dis));
memset(num, 0, sizeof(num));
}
int main () {
scanf("%d%d%d", &n, &ML, &MD);
for(register int i = 1; i <= ML; i ++) {
int x, y, d;
scanf("%d%d%d", &x, &y, &d);
add(x, y, d);
}
for(register int i = 1; i <= MD; i ++) {
int x, y, d;
scanf("%d%d%d", &x, &y, &d);
add(y, x, -d);
}
for(register int i = 1; i <= n; i ++) {
add(0, i, 0);
if(i != n) add(i + 1, i, 0);
}
clean(); spfa(0); clean(); spfa(1);
if(dis[n] == 0x3f3f3f3f) printf("-2\n");
else printf("%lld\n", dis[n]);
return 0;
}