100 #P1404. *【差分约束】糖果简单版

*【差分约束】糖果简单版

【题意】
nn 头牛派糖果,有 mm 个条件,每个条件三个整数 a b ca \ b \ c:表示 bb 号牛的糖果数比 aa号牛 多的个数小于等于 cc
nn 号牛 比 11 号牛最多多多少糖果(保证两者之间有直接或间接的约束关系)。

【输入格式】
第一行:两个整数 n mn \ m1n30000,1m1500001 \le n \le 30000,1 \le m \le 150000
下来 mm 行,每行三个整数 a b ca \ b \ c

【输出格式】
一个整数,表示 nn 号牛 比 11 号牛最多多多少糖果。
若无解,输出1-1

【样例输入】
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;
}