1509 Intervals

1509 Intervals

很明显这是一个差分约束的题目
求满足多个不等式的条件的东西,可以把不等式转换成图论中最短路问题然后进行松弛
这是一个很标准的差分约束系统问题
要求的不等式条件是:s[b[i]]-s[a[i]-1]≥c[i],其中s数组表示当前位置为止选择的个数
然后转换一下
s[b[i]] ≥ s[a[i]-1]+c[i]
s[i] ≥ s[i-1]+0
s[i-1] ≥ s[i]+(-1)

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=5e4+10;
const int INF=0x3fffffff;
typedef long long LL;
//差分约束系统标准题
int head[maxn],dis[maxn],vis[maxn];
struct node
{
    int to,dis,next;
}ed[maxn*2];
int cnt,n;
void add(int x,int y,int z)//邻接表建图
{
    ed[++cnt].dis=z;
    ed[cnt].to=y;
    ed[cnt].next=head[x];
    head[x]=cnt;
}
queue<int> q;
void spfa(int st)
{
    for(int i=1;i<=n;i++) dis[i]=-INF;
    //因为是求最长路
    dis[st]=0;
    q.push(st);
    vis[st]=1;
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        vis[t]=0;
        for(int i=head[t];i;i=ed[i].next)
        {
            int op=ed[i].to;
            if(dis[op]<dis[t]+ed[i].dis)//建立最长路
            {  
                dis[op]=dis[t]+ed[i].dis;
                if(!vis[op])
                {
                    vis[op]=1;
                    q.push(op);
                }
            }
        }
    }
}
int main(){
    scanf("%d",&n);
    int x,y,z;
    int st=INF,ed=-INF;
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        add(x-1,y,z);  //建边
        st=min(st,x-1);  //记得减一
        ed=max(ed,y);
    }
    for(int i=st;i<=ed;i++)
    {
        add(i-1,i,0);//差分建边,这个建边是根据不等式进行建边
        add(i,i-1,-1);
    }
    spfa(st);
    printf("%d\n",dis[ed]);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值