//差分约束系统
//以x-y <= k为例,等价于x <= k+y,相当于x和y之间的连边最大权值为k,然后跑最短路即知最大解。
//好久不做CodeVS了,洛谷大法好!
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
queue<int> q;
int n, m1, m2, tot;
bool flag = 0, vis[1010];
int dis[1010], st[1010], got[1010];
struct node{
int v, w, nxt;
} edge[20010];
inline void in(int x, int y, int z){
edge[++tot].v = y;
edge[tot].w = z;
edge[tot].nxt = st[x];
st[x] = tot;
}
inline void getInit(){
memset(vis, 0, sizeof(0));
for(int i = 0; i <= n; i++)
dis[i] = inf;
}
inline void GoSPFA(){
q.push(1);
vis[1] = 1;
dis[1] = 0;
while(!q.empty()){
int now = q.front(); q.pop();
vis[now] = 0;
for(int i = st[now]; i; i = edge[i].nxt){
int to = edge[i].v;
if(dis[to] > dis[now] + edge[i].w){
dis[to] = dis[now] + edge[i].w;
got[to]++;
if(got[to] >= n){
flag = 1;
return;
}
vis[to] = 1;
q.push(to);
}
}
}
}
int main(){
scanf("%d%d%d", &n, &m1, &m2);
for(int i = 1, x, y, z; i <= m1; i++){
scanf("%d%d%d", &x, &y, &z);
in(x, y, z);
}
for(int i = 1, x, y, z; i <= m2; i++){
scanf("%d%d%d", &x, &y, &z);
in(y, x, -z);
}
getInit();
GoSPFA();
if(flag) printf("-1\n");
else if(dis[n] < inf) printf("%d\n", dis[n]);
else printf("-2\n");
return 0;
}
CodeVS 1242 布局
最新推荐文章于 2019-11-02 11:31:39 发布