// 没有tuple structedge{ int u; int v; int w; // 结构体直接赋值也没有 edge(int _u,int _v,int _w){ u = _u; v = _v; w = _w; } };
vector<edge> e; // 有向边 [u,v,weight/length]
intmain(){ int N = read(); int ML = read(); int MD = read();
// 建图 rep(i,1,N) e.push_back(edge(i+1, i, 0)); // 从i+1->i权值为0的边 保证顺序i的距离不大于i+1 rep(i,0,ML){ //'喜欢'关系约束 <= DL int a = read(); int b = read(); // 保证 b>a int d = read(); // |距离| <= DL[i] /* b-a<=d, 即 a+d>=b 从a到b权值为d的边 */ e.push_back(edge(a,b,d)); } rep(i,0,MD){ //'不喜欢'关系约束 >= DD int a = read(); int b = read(); // 保证 b>a int d = read(); // |距离| >= DD[i] /* BD - AD >= DD 即 BD - DD >= AD, 从BD到AD权值-DD的边*/ e.push_back(edge(b,a,-d)); }
// Bellman_Ford vector<int>dist(N+1,INF);// 最短距离 dist[1] = 0; //循环N-1次 对所有边进行松弛操作 rep(t,0,N-1) rep(i,0,e.size()){ edge &uvw = e[i]; // 不支持auto int u = uvw.u; int v = uvw.v; int w = uvw.w; if(dist[u] != INF) dist[v] = min(dist[v], dist[u] + w); }
//再遍历一次所有边(第N次循环)如果本次有更新,则存在负环 bool ngloop = false; rep(i,0,e.size()){ edge &uvw = e[i]; // 不支持auto int u = uvw.u; int v = uvw.v; int w = uvw.w; if(dist[u] != INF && dist[u] + w < dist[v] ) ngloop = true; } int ans = dist[N]; if (ngloop) ans = -1; elseif(ans == INF) ans = -2; printf("%d\n", ans); return0; }