/* *State: HDU3592 31MS 448K 2009 B C++ *题目大意: * 有N个人按照1-N 的顺序排成一排,给你X个关于他们位置的关系, * 如:a, b ,c,则说明编号为a的人在标号为b 的人的前面,且两人 * 最多相隔c距离,再给你Y给位置关系,给出的是a和b两个人至少相 * 距c,问1号人和N号人最远相距多少。如果不存在这样的排序,则输 * 出-1 ,如果1和N可以相距任意的距离,则输出-2, 否则输出最长 * 的距离。 *解题思路: * 由于求的是最大的距离,所以要用约束条件的最短路来求。题目已经 * 给了两种约束条件了,但是这样做还是会wa,因为少了Sv - Su >= 0 * 这个约束条件。所以一共有三种约束条件。最后注意当图是不连通的时 * 候就是-2的情况。所以就不用并查集来判断一遍啦。 *解题感想: * 注意寻找完整全部的约束条件,还有要用最短路,还是最长路。 */
View Code
#include <iostream> #include <map> #include <string> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1005; const int MAXE = 1000005; const __int64 inf = 1000000000000ll; typedef struct _uq { int p; }UQ; UQ uqSet[MAXN]; typedef struct _node { int u, v, w; int next; }N; N edge[2 * MAXE]; int head[MAXN], cntEdge; void init() { cntEdge = 0; for(int i = 0; i < MAXN; i++) { head[i] = -1; uqSet[i].p = i; } } void addEdge(int u, int v, int w) { edge[cntEdge].u = u; edge[cntEdge].v = v; edge[cntEdge].w = w; edge[cntEdge].next = head[u]; head[u] = cntEdge++; } __int64 Bellman_ford(int s, int n) { __int64 dis[MAXN]; for(int i = 0; i <= n; i++) dis[i] = inf; dis[s] = 0; for(int i = 0; i < n-1; i++) { bool flag = false; for(int j = 0; j < cntEdge; j++) { int u = edge[j].u; int v = edge[j].v; __int64 w = edge[j].w; if(dis[v] > dis[u] + w) { dis[v] = dis[u] + w; flag = true; } } if(!flag) break; } /*cout << "-----------------" << endl; for(int i = 0; i <= n; i++) cout << dis[i] << " "; cout << "-----------------" << endl;*/ for(int f = 0; f < cntEdge; f++) { int u = edge[f].u, v = edge[f].v; __int64 w = edge[f].w; if(dis[v] > dis[u] + w) return -1; } return dis[n]; } int main(void) { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int n, cas; scanf("%d", &cas); while(cas--) { init(); int x, y, u, v, w; scanf("%d %d %d", &n, &x, &y); for(int i = 0; i < x; i++) { scanf("%d %d %d", &u, &v, &w); addEdge(u, v, w); } for(int i = 0; i < y; i++) { scanf("%d %d %d", &u, &v, &w); addEdge(v, u, -w); } for(int i = 1; i <= n; i++) { addEdge(i, i - 1, 0); } __int64 sol = Bellman_ford(1, n); if(sol == -1) printf("-1\n"); else if(sol == inf) printf("-2\n"); else printf("%I64d\n", sol); } return 0; }