题目链接:https://vjudge.net/problem/POJ-1201
解题思路:
设f[i+1]为0-i区间最少花费数,那么有f[b+1]-f[a]>=c[i],还有默认条件0<=f[i]-f[i-1]<=1.
根据此三个条件建立图跑最短路即可.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <time.h>
#define inf 0x3f3f3f3f
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef pair<int,int> P;
int n;
const int mx = 5e4 + 10;
int dis[mx];
vector < pair<int,int> > vec[mx];
bool vis[mx];
int spfa(int x,int y)
{
queue <int> que;
que.push(x);
memset(dis,-inf,sizeof(dis));
dis[x] = 0;
while(!que.empty()){
int now = que.front();
que.pop();
vis[now] = 0;
for(int i=0;i<vec[now].size();i++){
P tmp = vec[now][i];
int u = tmp.first;
if(dis[u]<dis[now]+tmp.second)
{
dis[u] = dis[now] + tmp.second;
if(!vis[u]){
vis[u] = 1;
que.push(u);
}
}
}
}
return dis[y];
}
int main()
{
scanf("%d",&n);
int a,b,c;
int mi = 1e9,ma = 0;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
a,b++;
//vec[a].push_back(b);
vec[a].push_back(P(b,c));
mi = min(mi,a);
ma = max(ma,b);
}
for(int i=mi;i<ma;i++) vec[i].push_back(P(i+1,0)),vec[i+1].push_back(P(i,-1));
printf("%d\n",spfa(mi,ma));
return 0;
}