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 ...
随机推荐
- Java_Web三大框架之Struts2
今天正式接触Java_Web三大框架之Struts2框架.对于初学者来说,先来了解什么是框架技术: 一.“框架技术”帮我们更快更好地构建程序: 1.是一个应用程序的半成品 2.提供可重用的公共结构 3 ...
- Caffe:导入caffePython-PyQt failed
在另一台电脑上使用caffe python版本,显示 Backend Qt5Agg is interactive backend. Turning interactive mode on. ...
- 通过python xlsxwriter模块生成EXCEL柱状图、饼图
xlsxwriter模块不是python自带的,使用pip下载 import xlsxwriter #新建一个excel文件,起名为expense01.xlsx workbook = xlsxwrit ...
- js的一些老司机写法
//取整 parseInt(a,10); //Before Math.floor(a); //Before a>>0; //Before ~~a; //After a|0; //After ...
- mysql跟java时间类型转换
参照这个就行了,这个对应注入类型.===========java注入数据库==========java类型 mysql类型 成功与否date date yesdate time nodate time ...
- Linux - centos7 下 MySQL(mariadb) 和 主从复制
目录 Linux - centos7 下 MySQL(mariadb) 和 主从复制 MySQL(mariadb) 安装MySQL(mariadb) 配置数据库的中文支持 在远程用 mysql客户端去 ...
- Git 基础教程 之 远程推送
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应了起来,并且,远程仓库默认名称是origin. git remote 查看远程库信息 git remote - ...
- 【模板】最小生成树Kruskal
洛谷3366 #include<cstdio> #include<algorithm> using namespace std; ,maxm=; ,ans=; struct e ...
- Codeforces 912D - Fishes
传送门:http://codeforces.com/contest/912/problem/D 本题是一个概率问题——求数学期望. 在一个n×m的方格中,有k个“*”.每个格子里可能有0~1个“*”. ...
- max_element()与min_element()
#include<iostream>#include<algorithm>using namespace std;bool cmp(int i,int j){ return i ...