100 #P1404. *【差分约束】糖果简单版
*【差分约束】糖果简单版
【题意】
给 头牛派糖果,有 个条件,每个条件三个整数 :表示 号牛的糖果数比 号牛 多的个数小于等于 。
求 号牛 比 号牛最多多多少糖果(保证两者之间有直接或间接的约束关系)。
【输入格式】
第一行:两个整数 ()
下来 行,每行三个整数 。
【输出格式】
一个整数,表示 号牛 比 号牛最多多多少糖果。
若无解,输出。
【样例输入】
2 2
1 2 5
2 1 4
【样例输出】
5
Hint
/*
求最多,跑最短路,约束形式:a-b<=c
*/
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+10;
vector<pair<int,int>>G[N];
int d[N],t[N],st,ed;
bool v[N];
int spfa()
{
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
memset(t,0,sizeof(t));
queue<int>q;q.push(st);v[st]=1;d[st]=0;t[st]=1;
while(!q.empty())
{
int x=q.front();q.pop();v[x]=0;
for(auto i:G[x])
{
int y=i.first,w=i.second;
if(d[y]>d[x]+w)
{
d[y]=d[x]+w;
if(!v[y])
{
q.push(y),v[y]=1,t[y]++;
if(t[y]>ed-st+1)return -1;
}
}
}
}
return d[ed];
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
st=1e9,ed=0;
for(int i=1,x,y,c;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);//y-x<=c
G[x].push_back({y,c});
st=min({st,x,y});
ed=max({ed,x,y});
}
printf("%d\n",spfa());
return 0;
}