poj1201 Intervals,差分约束问题,spfa

题目大意:

有一个序列,题目用n个整数组合 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai,bi]这个区间的整数至少有ci个。如果存在这样的序列,请求出满足题目要求的最短的序列长度是多少。如果不存在则输出 -1。

输入:第一行包括一个整数n,表示区间个数,以下n行每行描述这些区间,第i+1行三个整数ai,bi,ci,由空格隔开,其中0<=ai<=bi<=50000 而且 1<=ci<=bi-ai+1。

输出:一行,输出满足要求的序列的长度的最小值。

sum[i] = sigma[1,i]

不等式:

sum[b[i]] - sum[a[i]-1] >= ci

sum[i+1] - sum[i] >= 0

sum[i] - sum[i+1] >= -1

对于

d[v] >= d[u] + w,可以转化为求最长路(u->v连边权值为w)来求d[i]的最小值

/*sum(i) =  sigma[1..i]
 *sum(bi) - sum(ai) >= ci
 *sum(i) - sum(i-1) >= 0
 *sum(i-1) - sum(i) >= -1
 *d(v) >= d(u) + w , 求最长路
 * */
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int maxn = 50000 + 100;
const int maxm = 500000 + 100;
const int INF = 1e8;

int head[maxn], tot;

struct Edge{
	int to, w, next;
}edge[maxm];

void init(){
	tot = 0;
	memset(head, -1, sizeof head );
}

void addedge(int u, int v, int w){
	edge[tot].to = v;
	edge[tot].w = w;
	edge[tot].next = head[u];
	head[u] = tot++;
}

int d[maxn];
bool vis[maxn];
queue<int> q;
int Mn, Mx;

int spfa(){
	int s = Mn;
	while(!q.empty()) q.pop();
	for(int i=Mn; i<=Mx; ++i) d[i] = -INF;
	memset(vis, false, sizeof vis );
	q.push(s); d[s] = 0; vis[s] = true;
	while(!q.empty()){
		int u = q.front(); q.pop();
		vis[u] = false;
		for(int i=head[u]; ~i; i=edge[i].next){
			int &v = edge[i].to;
			int &w = edge[i].w;
			if(d[v] < d[u] + w){
				d[v] = d[u] + w;
				if(!vis[v]){
					vis[v] = true;
					q.push(v);
				}
			}
		}
	}
	return d[Mx];
}

int main()
{
	int n, u, v, w;
	init();
	scanf("%d", &n);
	Mn = INF, Mx = -INF;
	for(int i=0; i<n; ++i){
		scanf("%d%d%d", &u, &v, &w);
		addedge(u, v+1, w);
		Mn = min(Mn, u);
		Mx = max(Mx, v+1);
	}
	for(int i=Mn; i<Mx; ++i){
		addedge(i, i+1, 0);
		addedge(i+1, i, -1);
	}
	printf("%d\n", spfa());
	return 0;
}
时间: 2024-07-30 23:53:23

poj1201 Intervals,差分约束问题,spfa的相关文章

poj1201 Intervals——差分约束

题目:http://poj.org/problem?id=1201 差分约束裸题: 设 s[i] 表示到 i 选了数的个数前缀和: 根据题意,可以建立以下三个限制关系: s[bi] >= s[ai-1] + ci ( 1 <= i <= n) s[i] >= s[i-1] + 0 ( 1 <= i <= mx) s[i-1] >= s[i] + (-1) (1 <= i <= mx) 然后求最长路,可以发现其中的 dis 值不会多余增大,也就满足题意要

poj1201——差分约束,spfa

poj1201——差分约束,spfa Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22553   Accepted: 8530 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of inte

「POJ1201」Intervals - 差分约束

->戳我进原题 *** Intervals Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30393 Accepted: 11768 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, the

【POJ1716】Integer Intervals——差分约束||贪心

题目大意:给出n个区间,现在要你找出一个点集,使得这n个区间都至少有2个元素在这个点集里面,问这个点集最少有几个点. 解法一:差分约束系统 分析:其实这道题应该说是POJ1201的简化版,不过要注意的一点是,如果你用的是SPFA,那么你的差分约束系统应该为: s[b+1]-s[a]>=2; s[b+1]-s[b]>=0; s[b]-s[b+1]>=1. 为什么下标要全部加上1呢?因为这里的a和b有可能为0,如果按照原来s[a-1]的写法会出现是s[-1]这类数组越界的问题. 代码: #i

POJ 1201 Intervals 差分约束

http://poj.org/problem?id=1201 TLE了很久,因为用了cin..... 思路和其他差分约束差不多,http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 如果区间[a, b]中至少有c个元素,如果用上面的博客,那么说明xa - xb >= c,但是注意这里是闭区间,xa - xb是不包括b这个点的, 就比如用了[a, b]有c个元素,[b, d]有x个,那么ans = c + x - 1个,

POJ 2983 Is the Information Reliable? 信息可靠吗 (差分约束,spfa)

题意:有n个站排成一列,针对每个站的位置与距离关系,现有多个约束条件,约束条件分两种:(1)确定的.明确说明站a距离站b多少个单位距离.(2)不确定的.只知道a在b的左边至少1个单位距离.  根据已知条件,问有没有冲突?不冲突则输出reliable. 思路: 第2种条件比较好确定,如果知道如何用最短路解差分约束的话. 问题在第1种,明确地说明了距离,怎么办?拆成两条式子,比如 dis(a,b)=c,那么可以写成 b-a>=c ,b-a<=c 这样,只要满足这两个条件,原来明确说明的距离也会成立

poj1201/zoj1508/hdu1384 Intervals(差分约束)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Intervals Time Limit: 10 Seconds      Memory Limit: 32768 KB You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: > reads the number of interva

POJ 2101 Intervals 差分约束

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27746   Accepted: 10687 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end points and

hdu 1384 Intervals (差分约束)

/* 给你 n 个区间 [Ai, Bi],要求从每一个区间中至少选出 Ci 个数出来组成一个序列 问:满足上面条件的序列的最短长度是多少? 则对于 不等式 f(b)-f(a)>=c,建立 一条 b 到 a 的边 权值为 c,则求的最长路 即为 最小值(集合) 而且有隐含条件:0<=f(a)-f(a-1)<=1 则有边权关系(a,a-1,0)以及(a-1,a,-1); */ /* 一般地,差分约束系统分两类:求最大差和最小差 1.求最大差 建立形如 A-B<=C 的不等式.在原图中加

POJ1201 Intervals[差分约束系统]

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26028   Accepted: 9952 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end po