[Vijos1532]区间 (差分约束)
又是一题我不会的模板题……
讲一下差分约束吧
差分约束
如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统。——某百科
说简单点吧
就是两值相减 是差分
相减得到的值在一个范围内 是约束
大致是求解一些数学方程问题的
本蒟蒻不会……
大致好像是用最短路来做
本蒟蒻不会最短路……
不会差分约束……
所以就很颓废了。
本题
我抄题解的
哎
太弱了
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> using namespace std; const int lim=50055; const int inf=999999999; int d[lim<<2]; struct self{int x,y,w;}s[lim<<2]; int first[lim<<2],nxt[lim<<2]; int m,n,a,b,c,tn,x,y,w; queue<int>q; bool inq[lim]; void add(int x,int y,int w) { n++; s[n].x=x;s[n].y=y;s[n].w=w; nxt[n]=first[x];first[x]=n; } void spfa() { int a,b; for(a=0;a<=m+1;a++)d[a]=-inf; d[0]=0; q.push(0); while(!q.empty()) { int u=q.front();q.pop();inq[u]=0; for(int e=first[u];e!=-1;e=nxt[e]) { if(d[s[e].y]<d[u]+s[e].w) { d[s[e].y]=d[u]+s[e].w; if(!inq[s[e].y]) { q.push(s[e].y); inq[s[e].y]=1; } } } } cout<<d[m+1]<<endl; } int main() { memset(first,-1,sizeof(first));memset(nxt,-1,sizeof(nxt)); scanf("%d",&tn); m=50000; for(a=1;a<=tn;a++) { scanf("%d%d%d",&x,&y,&w); x++;y++; m=max(m,x);m=max(m,y); add(x-1,y,w); } for(a=1;a<=m+1;a++) { add(a,a-1,-1); add(a-1,a,0); } spfa(); return 0; }