題目鏈接
分析
差分約束系統的模板題;
代碼
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 50005
#define M 150005
#define INF 1e9
using namespace std;
int tot,head[N],Next[M],val[M],vet[M];
void add(int x,int y,int z){
tot++;
val[tot]=z;
vet[tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
int n,l=INF,r=-INF,d[N],inq[N];
int SPFA(){
queue <int> q;
for(int i=l;i<=r;i++){
d[i]=0;
inq[i]=1;
q.push(i);
}
while(!q.empty()){
int u=q.front();q.pop();
inq[u]=0;
for(int i=head[u];i;i=Next[i]){
int v=vet[i];
if(val[i]+d[u]>d[v]){
d[v]=val[i]+d[u];
if(!inq[v]){
inq[v]=1;
q.push(v);
}
}
}
}
return d[r];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
l=min(l,x);
r=max(r,y+1);
add(x,y+1,z);
}
for(int i=l;i<=r;i++){
add(i,i+1,0);
add(i+1,i,-1);
}
printf("%d",SPFA());
return 0;
}
心得