// 思路 :
// 图建好后 剩下的就和上一篇的 火烧连营那题一样了 求得解都是一样的 
// 所以稍微改了就过了
// 最下面还有更快的算法 速度是这个算法的2倍
#include <iostream>
#include <map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MOD 1000000007
#define maxn 150010
#define maxm 50010
struct node{
int to;
int next;
int val;
}E[maxn];
int num;
int V[maxm];
int d[maxm],cnt[maxm];
bool f[maxm];
bool sfpa(int s,int t){// s既表示起点 有表示节点个数
queue <int> Q;
int u,v;
int e;
Q.push(s);
d[s]=;
f[s]=true;
while(!Q.empty()){
u=Q.front(); Q.pop();
cnt[u]++;
if(cnt[u]>s) return false;
f[u]=false;
for(e=V[u];e!=-;e=E[e].next){
v=E[e].to;
if(d[u]+E[e].val<d[v]){
d[v]=d[u]+E[e].val;
if(!f[v])
{
f[v]=true;
Q.push(v);
}
}
}
}
return true;
}
int main(){
int i,j,k;
int n,m;
while(scanf("%d",&n)!=EOF){
for(i=;i<=;i++)
{
V[i]=-;
d[i]=MOD;
cnt[i]=;
f[i]=false;
}
num=;
m=;
while(n--){
scanf("%d %d %d",&i,&j,&k);
m=max(m,max(i,j));
E[num].to=i-;
E[num].val=-k;
E[num].next=V[j];
V[j]=num++;
}
for(i=m;i>=;i--){
E[num].to=i;
E[num].val=;
E[num].next=V[i-];
V[i-]=num++; E[num].to=i-;
E[num].val=;
E[num].next=V[i];
V[i]=num++;
}
// if(
sfpa(m,);
printf("%d\n",-d[]);
// else
// printf("Bad Estimations\n"); } } // 下面给出更快的算法
// 主要思路:
更好的方法是:
1) 先仅仅用约束条件①构造网络图,各顶点到源点的最短距离初始为0,这是因为Si – Smx
<= 0,所以源点到各顶点的最短距离肯定是小于0的。注意本题中源点是S[mx]。
第4章 最短路径问题
- 201 -
2) 即刻用Bellman-Ford算法求各顶点到源点的最短路径(注意Bellman-Ford算法的思想),
在每次循环中,约束条件①判断完后再加上约束条件②和③的判断。
a) 约束条件②的判断:
S[i] <= S[i-1] + 1 等效于 S[i] – S[mx] <= S[i-1] – S[mx] + 1。
假设dist[i]为源点mx到顶点Si的最短路径,那么S[i] – S[mx]就是dist[i],S[i-1] – S[mx] + 1
就是dist[i-1] + 1,即如果顶点Si到源点的最短路径长度大于Si-1到源点的最短路径长度加1,则
修改dist[i]为dist[i-1] + 1。
b) 约束条件③的判断:
S[i-1]<=S[i] 等效于 S[i-1] – S[mx] <= S[i] – S[mx]。 详情见代码 #include <cstdio>
#include <cstring>
#define inf 99999
#define EMAX 50002
structe
{
int u, v, w;  //边:起点、终点、权值
}edges[EMAX];
int n; //区间的个数
int dist[EMAX];  //求得的从源点到各顶点的最短路径
int mn;   //所有区间左端点的最小值
int mx;   //所有区间右端点的最大值
void init( )  //初始化函数
{
int i;
for( i=0; i<EMAX; i++ )  //将源点到各顶点的最短路径长度初始为0
dist[i] = 0;
//这是因为Si-Smx<=0,所以源点到各顶点的最短距离肯定是小于0的
//Si:Z中小于等于i 的元素个数,即S[i] = |{s|s∈Z,s<=i}|
mx = 1;   mn = inf;
}
bool bellman_ford( )
{
int i, t; //循环变量和临时变量
int f = 1;//标志变量,为提前结束Bellman-Ford算法的标志变量
//只要某次循环过程中,没能改变源点到各顶点的最短距离,则可以提前结束
while( f )
{
f = 0;
//Bellman-Ford算法本身的循环,考虑每条边是否能改变源点到各顶点的最短距离
  for( i=0; i<n; i++ )
{
   t = dist[edges[i].u] + edges[i].w;
if( dist[edges[i].v]>t )
{
dist[edges[i].v] = t; f = 1;
}
}
//根据约束条件s[i] <= s[i-1] + 1进一步修改s[i]值
  for( i=mn; i<=mx; i++ )
{
   t = dist[i-1] + 1;
if( dist[i]>t )
{
dist[i] = t; f = 1;
}
}
//根据约束条件s[i-1] <= s[i], 进一步修改s[i-1]值
  for( i=mx; i>=mn; i-- )
{
t = dist[i];
if( dist[i-1]>t )
{
dist[i-1] = t; f = 1;
}
}
}
return true;
}
int main( )
{
while( scanf("%d", &n) != EOF )
{
init( );
int i;
  int u, v, w;  //区间的两个端点、ci
  for( i=0; i<n; i++ )
{
   scanf( "%d %d %d", &u, &v, &w );
//构造边<v,u-1,-w>
   edges[i].u = v, edges[i].v = u - 1, edges[i].w = -w;
   if( mn>u )   mn = u;//求得mn为所有区间左端点的最小值
   if( mx<v )   mx = v;//求得mx为所有区间右端点的最大值
}
bellman_ford( );   printf( "%d\n", dist[mx] - dist[mn-1] );
}
return 0;
}

poj 1201/zoj 1508 intervals 差分约束系统的更多相关文章

  1. zoj 1508 Intervals (差分约束)

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

  2. POJ 1201 &amp; HDU1384 &amp; ZOJ 1508 Intervals(差分约束+spfa 求最长路径)

    题目链接: POJ:http://poj.org/problem?id=1201 HDU:http://acm.hdu.edu.cn/showproblem.php? pid=1384 ZOJ:htt ...

  3. Intervals(差分约束系统)

    http://poj.org/problem?id=1201 题意:给定n个整数闭区间[a,b]和n个整数c,求一个最小的整数集合Z,满足Z里边的数中范围在闭区间[a,b]的个数不小于c个. 思路:根 ...

  4. poj 1201 TYVJ 1415 Intervals

    Description: 给定n个闭区间[ai,bi] 和n个整数ci,你需要构造一个集合Z,使得对于任何的i∈[1,n],Z中满足x∈[ai,bi]的x不少于ci个 求这样的整数集合Z至少包含多少个 ...

  5. POJ 1201 Intervals (差分约束系统)

    题意 在区间[0,50000]上有一些整点,并且满足n个约束条件:在区间[ui, vi]上至少有ci个整点,问区间[0, 50000]上至少要有几个整点. 思路 差分约束求最小值.把不等式都转换为&g ...

  6. PKU 1201 Intervals(差分约束系统+Spfa)

    题目大意:原题链接 构造一个集合,这个集合内的数字满足所给的n个条件,每个条件都是指在区间[a,b]内至少有c个数在集合内.问集合最少包含多少个点.即求至少有多少个元素在区间[a,b]内. 解题思路: ...

  7. POJ1201 Intervals差分约束系统(最短路)

    Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p ...

  8. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...

  9. POJ1201 Intervals[差分约束系统]

    Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26028   Accepted: 9952 Descri ...

随机推荐

  1. HTML中动态图片切换JQuery实现

    相信很多同学都注意到了,各大新闻或者娱乐网站都含有动态图片切换,那个漂亮的感觉让刚刚学习html的人,都非常好奇和心动.那下面就让我们看一下到底如何实现动态图片切换呢?看一下百度贴吧的效果图吧~ // ...

  2. CentOS 6.4 搭建SVN服务器

    SVN作为新一代代码版本管理工具,有很多优点,管理方便,逻辑明确,安全性高,代码一致性高.SVN数据存储有两种方式,BDB(事务安全表类型)和FSFS(一种不需要数据库的存储系统),为了避免在服务器连 ...

  3. 暑假学习日记:Splay树

    从昨天开始我就想学这个伸展树了,今天花了一个上午2个多小时加下午2个多小时,学习了一下伸展树(Splay树),学习的时候主要是看别人博客啦~发现下面这个博客挺不错的http://zakir.is-pr ...

  4. Class

    1. No const constructor Unlike other member functions, constructors may not be declared as const . W ...

  5. Android 通过程序添加桌面快捷方式

    原理:通过代码向 Launcher 中的广播接收者发送广播来创建快捷图标. 首先要声明的权限是: <!--添加图标的权限--> <uses-permission android:na ...

  6. 02 - 用wxStreamToTextRedirector和wxTextCtrl输出std::cout

    遇到问题,单行显示, new line丢失 原因: wxTextCtrl默认是单行的 解决办法:使用wxTE_MULTILINE参数初始化wxTextCtrl wxTextCtrl *text = , ...

  7. 【转载】Dom篇

    一. 初探Dom     1. Dom介绍 二. Dom基础     1. window顶级对象     2. body.document对象事件     3. 通用的HTML元素的事件     4. ...

  8. TVM 下载监控

    iftop -n -i em1 -F 218.26.188.220/32 到10.10.81.23上用上面的语句看山西的流量. 到/opt/data/log/下看日志 到/opt/data/tvmca ...

  9. 在win7之后安装Ubuntu14.04系统后,丢失对win7的引导

    安装完ubuntu 14.04后,开机直接进入ubuntu.但是win7下的分区还在,只是未显示引导菜单. 恢复步骤: (前提是机器上确实存在win7的引导) $ sudo update-grub G ...

  10. lintcode: 爬楼梯

    题目: 爬楼梯 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 样例 比如n=3,中不同的方法 返回 3 解题: 动态规划题目,同时还是有顺序 ...