[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;
}

 

posted @ 2018-10-16 18:29  lincold  阅读(243)  评论(0编辑  收藏  举报