差分约束系统。
如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
求解差分约束系统,可以转化成图论的单源最短路径问题。观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v] <=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。再增加一个原点(s,s)与所有定点相连,边权均为0。对这个图以s为原点运行Bellman-ford算法(或SPFA算法),最终{d[i]}即为一组可行解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define MAX_INT 0x3f3f3f3f
struct node
{
int v;
int w;
int next;
};
int head[51000],dist[51000],visit[51000],le;
node edge[151000];
queue <int> Q;
void addEdge(int u,int v,int w)
{
edge[le].v=v;
edge[le].w=w;
edge[le].next=head[u];
head[u]=le;
le++;
}
int spfa(int sta,int end)
{
int i,j,t,v;
for(i=sta;i<=end;i++)
dist[i]=-MAX_INT;
Q.push(sta);
visit[end]=1;
dist[sta]=0;
while(!Q.empty())
{
t=Q.front();
Q.pop();
visit[t]=0;
for(j=head[t]; j!= -1;j=edge[j].next)
{
v=edge[j].v;
if(dist[v] < dist[t]+edge[j].w)
{
dist[v]=dist[t]+edge[j].w;
if(!visit[v])
{
visit[v]=1;
Q.push(v);
}
}
}
}
return dist[end];
}
int main()
{
int i,n,s,t,w,min1,max1;
while(cin>>n)
{
min1=MAX_INT; max1=-MAX_INT;
memset(head,-1,sizeof(head));
le=1;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&s,&t,&w);
addEdge(s,t+1,w);
if(min1>s) min1=s;
if(max1<t+1) max1=t+1;
}
for(i=min1; i<max1;i++)
{
addEdge(i,i+1,0);
addEdge(i+1,i,-1);
}
printf("%d\n",spfa(min1,max1));
}
return 0;
}