链接:点击打开链接
题意:一些牛按序号排成一条直线,有两种要求,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;
}
本文介绍了一个使用SPFA算法解决特定路径问题的例子。该问题涉及在考虑两种约束条件下(A和B的距离不超过X,或者不少于Y),计算编号为1的牛与编号为N的牛之间可能的最大距离。通过构造图并利用SPFA算法进行最短路径计算,最终得到最大可行距离。

928

被折叠的 条评论
为什么被折叠?



