题目链接:

POJ:http://poj.org/problem?id=1201

HDU:http://acm.hdu.edu.cn/showproblem.php?

pid=1384

ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=508

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 integers c1, ..., cn from the standard input, 

computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,...,n, 

writes the answer to the standard output. 

Input

The first line of the input contains an integer n (1 <= n <= 50000) -- the number of intervals. The following n lines describe the intervals. The (i+1)-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <=
ai <= bi <= 50000 and 1 <= ci <= bi - ai+1.

Output

The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i=1,2,...,n.

Sample Input

5
3 7 3
8 10 3
6 8 1
1 3 1
10 11 1

Sample Output

6

Source

题意:(转)

[ai, bi]区间内和点集Z至少有ci个共同元素。那也就是说假设我用Si表示区间[0,i]区间内至少有多少个元素的话,那么Sbi - Sai >= ci,这样我们就构造出来了一系列边。权值为ci,可是这远远不够。由于有非常多点依旧没有相连接起来(也就是从起点可能根本就还没有到终点的路线),此时。我们再看看Si的定义。也不难写出0<=Si
- Si-1<=1的限制条件。尽管看上去是没有什么意义的条件,可是假设你也把它构造出一系列的边的话,这样从起点到终点的最短路也就顺理成章的出现了。

我们将上面的限制条件写为允许的形式:

Sbi - Sai >= ci

Si - Si-1 >= 0

Si-1 - Si >= -1

这样一来就构造出了三种权值的边。而最短路自然也就没问题了。

但要注意的是,因为查分约束系统里经常会有负权边,所以为了避免负权回路,往往用Bellman-Ford或是SPFA求解(存在负权回路则最短路不存在)。

PS:

由于求的是[ai,bi]区间,所以我们加入边的时候须要(u-1, v, w)!

把距离dis初始化为负无穷, if(dis[v] < dis[u] + w)就可以!

POJ 和ZOJ用队列和栈都能过,可是HDU用栈会超时,仅仅能用队列!

代码例如以下:(栈)

#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define N 50017
#define M 50017
int n, m, k;
int Edgehead[N], dis[N];
struct Edge
{
int v,w,next;
} Edge[3*M];
bool vis[N];
//int cont[N];
int minn, maxx;
int MIN(int a, int b)
{
if(a < b)
return a;
return b;
}
int MAX(int a, int b)
{
if(a > b)
return a;
return b;
}
void Addedge(int u, int v, int w)
{
Edge[k].next = Edgehead[u];
Edge[k].w = w;
Edge[k].v = v;
Edgehead[u] = k++;
}
int SPFA( int start)//stack
{
int sta[N];
int top = 0;
//memset(cont,0,sizeof(cont);
for(int i = 1 ; i <= n ; i++ )
dis[i] = -INF;
dis[start] = 0;
//++cont[start];
memset(vis,false,sizeof(vis));
sta[++top] = start;
vis[start] = true;
while(top)
{
int u = sta[top--];
vis[u] = false;
for(int i = Edgehead[u]; i != -1; i = Edge[i].next)//注意
{
int v = Edge[i].v;
int w = Edge[i].w;
if(dis[v] < dis[u] + w)
{
dis[v] = dis[u]+w;
if( !vis[v] )//防止出现环
{
sta[++top] = v;
vis[v] = true;
}
// if(++cont[v] > n)//有负环
// return -1;
}
}
}
return dis[maxx];
}
int main()
{
int u, v, w;
while(~scanf("%d",&n))//n为目的地
{
k = 1;
memset(Edgehead,-1,sizeof(Edgehead));
minn = INF;
maxx = -1;
for(int i = 1 ; i <= n ; i++ )
{
scanf("%d%d%d",&u,&v,&w);
Addedge(u-1,v,w);
maxx = MAX(v,maxx);
minn = MIN(u-1,minn); }
for(int i = minn; i <= maxx; i++)//新边,保证图的连通性还必须加入每相邻两个整数点i,i+1的边
{
Addedge(i,i+1,0);
Addedge(i+1,i,-1);
}
int ans = SPFA(minn);//从点minn開始寻找最短路
printf("%d\n",ans);
}
return 0;
}

HDU队列:

#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 0x3f3f3f3f
#define N 50017
#define M 50017
int n, m, k;
int Edgehead[N], dis[N];
struct Edge
{
int v,w,next;
} Edge[3*M];
bool vis[N];
//int cont[N];
int minn, maxx;
int MIN(int a, int b)
{
if(a < b)
return a;
return b;
}
int MAX(int a, int b)
{
if(a > b)
return a;
return b;
}
void Addedge(int u, int v, int w)
{
Edge[k].next = Edgehead[u];
Edge[k].w = w;
Edge[k].v = v;
Edgehead[u] = k++;
}
int SPFA( int start)//stack
{
queue<int>q;
//int sta[N];
//memset(cont,0,sizeof(cont);
int top = 0;
for(int i = minn ; i <= maxx ; i++ )
dis[i] = -INF;
dis[start] = 0;
//++cont[start];
memset(vis,false,sizeof(vis));
//sta[++top] = start;
q.push(start);
vis[start] = true;
while(!q.empty())
{
//int u = sta[top--];
int u = q.front();
q.pop();
vis[u] = false;
for(int i = Edgehead[u]; i != -1; i = Edge[i].next)//注意
{
int v = Edge[i].v;
int w = Edge[i].w;
if(dis[v] < dis[u] + w)
{
dis[v] = dis[u]+w;
if( !vis[v] )//防止出现环
{
//sta[++top] = v;
q.push(v);
vis[v] = true;
}
// if(++cont[v] > n)//有负环
// return -1;
}
}
}
return dis[maxx];
}
int main()
{
int u, v, w;
while(~scanf("%d",&n))//n为目的地
{ k = 1;
memset(Edgehead,-1,sizeof(Edgehead));
minn = INF;
maxx = -1;
for(int i = 1 ; i <= n ; i++ )
{
scanf("%d%d%d",&u,&v,&w);
Addedge(u-1,v,w);
maxx = MAX(v,maxx);
minn = MIN(u-1,minn); }
for(int i = minn; i <= maxx; i++)//新边,保证图的连通性还必须加入每相邻两个整数点i,i+1的边
{
Addedge(i,i+1,0);
Addedge(i+1,i,-1);
}
int ans = SPFA(minn);//从点minn開始寻找最短路
printf("%d\n",ans);
}
return 0;
}

POJ 1201 &amp; HDU1384 &amp; ZOJ 1508 Intervals(差分约束+spfa 求最长路径)的更多相关文章

  1. zoj 1508 Intervals (差分约束)

    Intervals Time Limit: 10 Seconds      Memory Limit: 32768 KB You are given n closed, integer interva ...

  2. poj 1201/zoj 1508 intervals 差分约束系统

      // 思路 : // 图建好后 剩下的就和上一篇的 火烧连营那题一样了 求得解都是一样的 // 所以稍微改了就过了 // 最下面还有更快的算法 速度是这个算法的2倍#include <ios ...

  3. poj Layout 差分约束+SPFA

    题目链接:http://poj.org/problem?id=3169 很好的差分约束入门题目,自己刚看时学呢 代码: #include<iostream> #include<cst ...

  4. poj 1201 Intervals(差分约束)

    题目:http://poj.org/problem?id=1201 题意:给定n组数据,每组有ai,bi,ci,要求在区间[ai,bi]内至少找ci个数, 并使得找的数字组成的数组Z的长度最小. #i ...

  5. poj 1201 Intervals——差分约束裸题

    题目:http://poj.org/problem?id=1201 差分约束裸套路:前缀和 本题可以不把源点向每个点连一条0的边,可以直接把0点作为源点.这样会快许多! 可能是因为 i-1 向 i 都 ...

  6. POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束

    POJ 1201 http://poj.org/problem?id=1201 题目大意: 有一个序列,题目用n个整数组合 [ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai, ...

  7. poj 1716 Integer Intervals (差分约束 或 贪心)

    Integer Intervals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12192   Accepted: 514 ...

  8. poj1201 Intervals【差分约束+SPFA】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303365.html   ---by 墨染之樱花 题目链接:http://poj.org/pr ...

  9. poj1201 Intervals——差分约束

    题目:http://poj.org/problem?id=1201 差分约束裸题: 设 s[i] 表示到 i 选了数的个数前缀和: 根据题意,可以建立以下三个限制关系: s[bi] >= s[a ...

随机推荐

  1. new一个接口

    首先我们先看看接口的定义: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方 ...

  2. React安装 脚手架create-react-app安装步骤及问题

    create-react-app 是来自于 Facebook的脚手架,通过该命令我们无需配置就能快速构建 React 开发环境. 安装步骤: 1.先装脚手架     PS:第一次装直接在打开CMD默认 ...

  3. [hihocoder][Offer收割]编程练习赛49

    相似颜色 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...

  4. Android学习——控件ListView的使用

    一.ListView的简单用法 首先新建一个ListViewTest项目,并让Android Studio自动创建好活动.然后修改activity_main.xml中的代码,如下: <?xml ...

  5. PowerDesigner 逆向工程 Could not Initialize JavaVM!

    原项目的大量的表,使用PowerDesigner 进行逆向工程.提示Could not Initialize JavaVM! 网上找到原因,PowerDesigner 不可以使用64位JDK环境! 有 ...

  6. 【Oracle】数据库热备

    1. 创建脚本 注:脚本第三行中的DB_NAME,需要改为自己的数据库名(show parameter name;): oracle用户下新建目录:/home/oracle/DB_NAME/hot_b ...

  7. Windows上部署Python

    以Python 3.5为例 1.到https://www.python.org/downloads/windows/下载embeddable zip file类型的压缩包python-3.5.1-em ...

  8. jQuery 父级,祖先,兄弟,等选择性操作

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  9. JS 1000以内的水仙花数 (三位数 各个数字的立方和等于本身 例如 1*1*1 + 5*5*5 + 7*7*7 = 157)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 路飞学城Python-Day115

    个人博客搭建 from django.db import models from django.contrib.auth.models import User, AbstractUser # Crea ...