hdu1384 poj1202 Intervals --- 差分约束

2024-05-28 10:58

本文主要是介绍hdu1384 poj1202 Intervals --- 差分约束,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

差分约束系统

差分约束系统的应用难点在于将实际问题转换为差分约束系统。


简单来说,要构造出一系列满足题意的不等式 形如 Si-Sj<=Ck,且必须含等号。

对于每一个这样的不等式,构造有向边 w(j->i)=Ck。

为保证图的连通,我们引入附加结点Vs。初始化w(s->i)=0,d[Vs]=0

接下来就是求解源点到其他点的单源最短路径。


由于差分约束系统中通常含负值,所以我们一般用spfa或者bellman来求最短路径。

这里有个技巧,不想要添加附加结点的话,可以开始将所有点加入队列,相当于Vs入队,接下来的更新没有指回Vs的结点,所以可以省略。


注意点:
1. 如果要求最大值想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意x-y<k =>x-y<=k-1
如果要求最小值的话,变为x-y>=k的标准形式,然后建立一条从y到x的k边,求出最长路径即可
2.如果权值为正,用dj,spfa,bellman都可以,如果为负不能用dj,并且需要判断是否有负环,有的话就不存在


---------------回到这道题--------------

题意:

构造一个集合,要求对每一个给定的区间 [a, b],至少包含其中的n个数

求满足条件的集合内最少含多少个数。


思路:

令Si表示在[0,i-1]区间内要选多少个数。则可列出不等式:

S(b+1)-Sa>=C

另外,由于一个数至多取一个,至少取0个,则有:

0=< Si-S(i-1)<=1

根据以上不等式构图,以给定区间的最小值为起点,最大值为终点,求解最长路即可。


小结:

其实不等式就可以看成图中边权需要满足的条件,将所有不满足条件的边更新就是了。


#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;struct node
{int v,w,next;
}e[50010];int d[50010],head[50010],inq[50010],n,h,minn,maxx;void init()
{memset(head,-1,sizeof head);h=0;
}void addedge(int a,int b,int c)
{e[h].v=b;e[h].w=c;e[h].next=head[a];head[a]=h++;
}void spfa()
{memset(d,0,sizeof d);//求最长路 赋值为0memset(inq,0,sizeof inq);// memset(outq,0,sizeof outq);queue<int> q;//省略掉那个虚点,可以优化spfa.虚点作用是让所有点入队//所以省略掉这点的话,需要手动把所有点入队for(int i=minn;i<=maxx;i++){q.push(i);inq[i]=1;}d[minn]=0;while(!q.empty()){int x=q.front();q.pop();inq[x]=0;// outq[x]++;// if(outq[x]>n) return -1;//存在负环//此题不存在for(int i=head[x];i!=-1;i=e[i].next){if(d[e[i].v]<d[x]+e[i].w){d[e[i].v]=d[x]+e[i].w;if(!inq[e[i].v]){inq[e[i].v]=1;q.push(e[i].v);}}}if(x>minn&&d[x-1]<d[x]-1){d[x-1]=d[x]-1;if(!inq[x-1]){inq[x-1]=1;q.push(x-1);}}if(x<maxx&&d[x+1]<d[x]){d[x+1]=d[x];if(!inq[x+1]){inq[x+1]=1;q.push(x+1);}}}
}int main()
{int a,b,c;while(~scanf("%d",&n)){init();//又忘了这个maxx=-1;minn=inf;for(int i=0;i<n;i++){scanf("%d%d%d",&a,&b,&c);addedge(a,++b,c);maxx=max(maxx,b);minn=min(minn,a);}spfa();printf("%d\n",d[maxx]);}return 0;
}


这篇关于hdu1384 poj1202 Intervals --- 差分约束的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010371

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

创建表时添加约束

查询表中的约束信息: SHOW KEYS FROM 表名; 示例: 创建depts表包含department_id该列为主键自动增长,department_name列不允许重复,location_id列不允许有空值。 create table depts(department_id int primary key auto_increment,department_name varcha

非空约束(Not Null)

修改表添加非空约束 使用DDL语句添加非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL; 示例: 向emp表中的salary添加非空约束。 alter table emp modify salary float(8,2) not NULL; 删除非空约束 使用DDL语句删除非空约束 ALTER TABLE 表名 MODIFY 列名 类型 NULL;

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L

javaweb-day01-3(XML 的 dtd 约束)

XML 的约束方式有两种:dtd 和 schema  DTD约束: Document Type Definition    文档类型定义、文档类型界定。 入门示例: book.xml : <?xml version="1.0" encoding="gb2312"?><!DOCTYPE 书架 SYSTEM "book.dtd"><书架><书><书名>J

oracle2之约束

《1》子查询和关联查询 建立表如下: 学生基本信息表 CREATE Student( [Studentid][Int]IDENTITY(1,1)NOT NULL primary key,--主键 [StudentName][char]NOT NULL ) 课程信息表 CREATE Subject( [SubjectID][char]NOT NUL