这道题一开始想的就是差分约束,后来由于考虑不当导致WA,我们考虑其实题目给的是m个不等式,即sum[b[i]]-sum[a[i]-1]>=c[i],而我却忽略了剩下的两个重要的不等式,即sum[i]>=sum[i-1],sum[i]<=sum[i-1]+1,虽然这两个不等式看起来很显然,但我们必须考虑到它们,因为对于任何情况,这两个不等式是前缀和的基本不等式,综合这3个不等式,我们就能够利用spfa解决这道题目。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 100005
int n,m,l;
int last[maxn],pre[maxn*2],other[maxn*2],len[maxn*2];
int que[maxn+5],h,t,dis[maxn],ans;
bool vis[maxn];
void connect(int x,int y,int z)
{
l++;
pre[l]=last[x];
last[x]=l;
other[l]=y;
len[l]=z;
}
void spfa(void)
{
h=0;
while (h!=t)
{
h=h%maxn+1;
int u=que[h];vis[u]=0;
for (int p=last[u];p;p=pre[p])
{
int v=other[p];
if (dis[v]<dis[u]+len[p])
{
dis[v]=dis[u]+len[p];
if (!vis[v])
{
vis[v]=1;
t=t%maxn+1;
que[t]=v;
}
}
}
}
printf("%d\n",dis[n]);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
connect(a-1,b,c);
}
for (int i=1;i<=n;i++)
{
connect(i-1,i,0);
connect(i,i-1,-1);
}
for (int i=0;i<=n;i++) {que[++t]=i;vis[i]=1;}
spfa();
return 0;
}