正题
luogu 4644
题目大意
给你一段时间,有n头奶牛,第i头可以花费sis_isi的代价清理lil_ili到rir_iri,问你清理完所有时间段的最小代价
解题思路
所有点需求都为1的线性规划,直接代入最短路就可以了
code
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
#define mp make_pair
#define fs first
#define sn second
using namespace std;
ll n,l,r,x,y,z,tot,p[N],b[N],h[N];
priority_queue<pair<ll,ll> >d;
struct rec
{ll to,nx,l;
}e[N<<2];
void add(ll x,ll y,ll z)
{e[++tot].to=y;e[tot].l=z;e[tot].nx=h[x];h[x]=tot;return;
}
bool dij()
{memset(b,127/3,sizeof(b));b[l] = 0;d.push(mp(0,l));while(!d.empty()){ll u=d.top().sn;d.pop();if(p[u])continue;p[u]=1;for(int i=h[u];i;i=e[i].nx){ll v=e[i].to;if(b[u]+e[i].l<b[v]){b[v]=b[u]+e[i].l;d.push(mp(-b[v],v));}}}return p[r+1];
}
int main()
{scanf("%lld%lld%lld",&n,&l,&r);for(int i=l;i<r;++i)add(i+1,i,0);for(int i=1;i<=n;++i){scanf("%lld%lld%lld",&x,&y,&z);add(x,y+1,z);}if(dij())printf("%lld",b[r+1]);else puts("-1");return 0;
}