题意
给出两种关系,某两头奶牛间的距离不超过L或不小于D,奶牛排在队伍中的顺序和它们的编号是相同的,同一位置可站多头奶牛,求1号奶牛和N号奶牛间可能的最大距离,无解输出-1,INF输出-2。
分析
差分约束跑最短路
根据题目,可列出以下式子:( u < v )
从v到u连一条边权为L的边
从u到v连一条边权为-D的边
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXM 10010
#define MAXN 1005
#define INF 100000000000000
#define LL long long
struct node
{
int v,w,nxt;
}e[MAXM];
int Adj[MAXN],c,n,cnt[MAXN];
void AddEdge(int u,int v,int val)
{
c++;
e[c].v=v,e[c].w=val;
e[c].nxt=Adj[u];
Adj[u]=c;
}
LL dis[MAXN];
bool vis[MAXN];
bool SPFA(int s,int t)
{
queue<int>q;
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[s]=0;
vis[s]=true;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=false;
for(int i=Adj[u];i;i=e[i].nxt)
{
int v=e[i].v,d=e[i].w;
if(dis[u]<INF&&dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
if(!vis[v])
{
q.push(v);
vis[v]=true;
cnt[v]++;
if(cnt[v]>n)
return false;
}
}
}
}
return true;
}
int main()
{
int L,D,u,v,x;
scanf("%d%d%d",&n,&L,&D);
for(int i=0;i<L;i++)
{
scanf("%d%d%d",&u,&v,&x);
AddEdge(u,v,x);
}
for(int i=0;i<D;i++)
{
scanf("%d%d%d",&u,&v,&x);
AddEdge(v,u,-x);
}
if(SPFA(1,n))
{
if(dis[n]==INF)
printf("-2\n");
else printf("%lld\n",dis[n]);
}
else printf("-1\n");
}