Intervals(差分约束系统)
http://poj.org/problem?id=1201
题意:给定n个整数闭区间[a,b]和n个整数c,求一个最小的整数集合Z,满足Z里边的数中范围在闭区间[a,b]的个数不小于c个。
思路:根据题目描述,可建模成一个差分约束系统。
设S[i]表示小于等于i的整数的个数,R表示最大的右端点值,L表示最小的左端点值:
则 S[b] - S[a-1] >= c;
转化成:S[a-1] - S[b] <= -c;...... (1)
S[i] - S[i-1] <= 1; ........ (2)
S[i] -S[i-1] >= 0;
转化成:S[i-1] - S[i] <= 0;.......... (3)
(1)(2)(3)即为三个约束条件。最终要求的就是S[R] - S[L-1] >= M,即 S[L-1] - S[R] <= -M;
#include <stdio.h>
#include <string.h>
const int N=;
const int INF=<<;
struct node
{
int u,v,w;
} edge[N];
int dis[N];
int n,cnt,l,r;//l表示所有左端点的最小值,r表示所有右端点的最大值
void add(int u,int v,int w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt++].w = w;
}
bool bellman_ford()
{
memset(dis,,sizeof(dis));
int flag = ;//只要某次循环过程中,没能改变源点到各顶点的最短距离,则可以提前结束循环
while(flag)
{
flag = ;
for (int i = ; i < n; i++)
{
int u = edge[i].u;
int v = edge[i].v;
if (dis[v] > dis[u]+edge[i].w)
{
dis[v] = dis[u]+edge[i].w;
flag = ;
}
}
for (int i = l; i <= r; i++)//根据约束条件s[i] <= s[i-1]+1,进一步修改s[i];
{
if (dis[i-]+ < dis[i])
{
dis[i] = dis[i-]+;
flag = ;
}
}
for (int i = r; i >= l; i--)//根据约束条件S[i] >= s[i-1],进一步修改s[i-1];
{
if (dis[i] < dis[i-])
{
dis[i-] = dis[i];
flag = ;
} }
}
return true;
}
int main()
{
int a,b,c;
while(~scanf("%d",&n))
{
cnt = ,r = ,l = INF;
for (int i = ; i < n; i++)
{
scanf("%d %d %d",&a,&b,&c);
add(b,a-,-c);//构造边
if (l > a)
l = a;//左端点的最小值
if (r < b)
r = b;//右端点的最小值
}
bellman_ford();
printf("%d\n",dis[r]-dis[l-]);
}
return ;
}
Intervals(差分约束系统)的更多相关文章
- POJ1201 Intervals差分约束系统(最短路)
Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p ...
- POJ 1201 Intervals (差分约束系统)
题意 在区间[0,50000]上有一些整点,并且满足n个约束条件:在区间[ui, vi]上至少有ci个整点,问区间[0, 50000]上至少要有几个整点. 思路 差分约束求最小值.把不等式都转换为&g ...
- POJ1201 Intervals[差分约束系统]
Intervals Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26028 Accepted: 9952 Descri ...
- poj 1201/zoj 1508 intervals 差分约束系统
// 思路 : // 图建好后 剩下的就和上一篇的 火烧连营那题一样了 求得解都是一样的 // 所以稍微改了就过了 // 最下面还有更快的算法 速度是这个算法的2倍#include <ios ...
- PKU 1201 Intervals(差分约束系统+Spfa)
题目大意:原题链接 构造一个集合,这个集合内的数字满足所给的n个条件,每个条件都是指在区间[a,b]内至少有c个数在集合内.问集合最少包含多少个点.即求至少有多少个元素在区间[a,b]内. 解题思路: ...
- 【POJ 1716】Integer Intervals(差分约束系统)
id=1716">[POJ 1716]Integer Intervals(差分约束系统) Integer Intervals Time Limit: 1000MS Memory L ...
- 【POJ 1201】 Intervals(差分约束系统)
[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS Memory Limit: ...
- POJ1201 Intervals(差分约束系统)
与ZOJ2770一个建模方式,前缀和当作点. 对于每个区间[a,b]有这么个条件,Sa-Sb-1>=c,然后我就那样连边WA了好几次. 后来偷看数据才想到这题还有两个隐藏的约束条件. 这题前缀和 ...
- POJ 2101 Intervals 差分约束
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27746 Accepted: 10687 Description You ...
随机推荐
- Git与SVN版本控制系统
关于版本控制 什么是版本控制?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任 ...
- getdlgitemtext
获取控件内信息 set 设置控件内信息 oninitdialog初始化控件时的操作
- 安卓手机安装charles安全证书
本次安装使用小米mix2为例. 手机浏览器上安装: 第一种: 1.首先 设置好手机的charles代理 172.16.xxx.xxx 8888 2.要使用 打开非自带浏览器(夸克/QQ/UC手 ...
- https webservice通讯 参考网址 http://blog.csdn.net/small____fish/article/details/8214938
一.生成密钥库和证书可参考以下密钥生成脚本,根据实际情况做必要的修改,其中需要注意的是:服务端的密钥库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意. 1.生成服务器证书库keyto ...
- oracle的递归运算(树运算) 无限树形
oracle的递归运算(树运算)start with org_id ='1'connect by prior parent_id=son_id 1.前言 oracle的递归运算,在我们web页面的 ...
- Win32 线程同步
Win32 线程同步 ## Win32线程同步 ### 1. 原子锁 ### 2. 临界区 {全局变量} CRITICAL_SECTION CS = {0}; // 定义并初始化临界区结构体变量 {线 ...
- HDU114 - Piggy-Bank 【完全背包】
在 ACM 能够开展之前,必须准备预算,并获得必要的财力支持.该活动的主要收入来自于 Irreversibly Bound Money (IBM).思路很简单.任何时候,某位 ACM 会员有少量的钱时 ...
- jQuery学习----简单介绍,基本使用,操作样式,动画
jQuery简单介绍 jq是js的插件库,说白了,jq就是一个js文件 凡事能用jq实现的,js都能实现.但是js能实现的,jq不一定能够实现 jq的引入 http://www.bootcdn.cn ...
- VNC Server Installation on CentOS 6.5
In my case I have a fresh installed CentOS6.5 Server on which I will be installing the VNC-server so ...
- 洛谷 P2486 BZOJ 2243 [SDOI2011]染色
题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...