标签:
题意:有N个人,然后X个关系和Y个关系,X关系代表的是这两个人的距离不能超过C,Y代表的是这两个人的距离要大于等于C,若不能满足所有的输出-1,若1与N的位置可以无穷大输出-2,否则输出两个人的最大距离
思路:就是查分约束的模型,X个关系按照位置建边,Y也是直接按位置建边就行了,就是两个初始方向不同,然后有负环的话就输出-1,距离无穷大输出-2,否则就是dis[N]的值就行了,自己讨论一下就可以出来了
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=20010; struct edge{ int from,to,cost; }; edge es[maxn]; ll dis[maxn]; int V,E; void shortest_path(int s){ for(int i=0;i<=V;i++) dis[i]=inf; dis[s]=0; while(1){ bool update=0; for(int i=0;i<E;i++){ edge e=es[i]; if(dis[e.from]!=inf&&dis[e.to]>dis[e.from]+e.cost){ dis[e.to]=dis[e.from]+e.cost; update=1; } } if(!update) break; } } bool find_negative_loop(){ memset(dis,0,sizeof(dis)); for(int i=0;i<V;i++){ for(int j=0;j<E;j++){ edge e=es[j]; if(dis[e.to]>dis[e.from]+e.cost){ dis[e.to]=dis[e.from]+e.cost; if(i==V-1) return 1; } } } return 0; } int main(){ int T,X,Y,a,b,c; scanf("%d",&T); while(T--){ scanf("%d%d%d",&V,&X,&Y); E=X+Y; int k=0; while(X--){ scanf("%d%d%d",&a,&b,&c); if(a<b) {es[k].from=a;es[k].to=b;es[k++].cost=c;} else {es[k].from=a;es[k].to=b;es[k++].cost=-c;} } while(Y--){ scanf("%d%d%d",&a,&b,&c); if(b<a) {es[k].from=b;es[k].to=a;es[k++].cost=c;} else {es[k].from=b;es[k].to=a;es[k++].cost=-c;} } if(find_negative_loop()){ printf("-1\n"); continue; } shortest_path(1); if(dis[V]==inf) printf("-2\n"); else printf("%d\n",dis[V]); } return 0; }
标签:
原文地址:http://blog.csdn.net/dan__ge/article/details/51792418