链接:点击打开链接
题意:一些牛按序号排成一条直线,有两种要求,A和B距离不得超过X,还有一种是A和B距离不得少于Y,问1和N可能的最大距离。
代码:
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,d[1005],deg[1005],vis[1005];
struct node{
int to,val;
};
vector<node> G[1005];
int spfa(int S){
int i,u,v,w;
for(i=1;i<=n;i++)
d[i]=INF,deg[i]=vis[i]=0;
queue<int> qu;
qu.push(S);
d[S]=0,vis[S]=deg[S]=1;
while(qu.size()){
u=qu.front();
qu.pop();
vis[u]=0;
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(vis[v]==0){
vis[v]=1;
deg[v]++;
if(deg[v]>n) //无解
return -1;
qu.push(v);
}
}
}
}
if(d[n]==INF) //任意解
return -2;
return d[n];
}
int main(){
int i,t,x,y,u,v,w;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&x,&y);
for(i=1;i<=n;i++) //两个限制条件,u1-v1<=w1,u2-v2>=w2
G[i].clear(); //最后求n-1<=?,全变成小于等于跑最短路
for(i=1;i<=x;i++){
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);
G[u].push_back((node){v,w});
}
for(i=1;i<=y;i++){
scanf("%d%d%d",&u,&v,&w);
if(u>v)
swap(u,v);
G[v].push_back((node){u,-w});
}
printf("%d\n",spfa(1));
}
return 0;
}