Intervals---poj1201(差分约束系统)

题目链接:http://poj.org/problem?id=1201

题目说[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

因为要求的是最小有多少个,所以要求最长路;

所以求出图中最小点到最大点的最大距离即可;

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <string>
typedef long long LL;
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
#define N 51500

using namespace std;

int S, E, vis[N], dist[N];
struct node
{
    int u, v, w, Next;
}e[N*3];

int Head[N], cnt;

void Add(int u, int v, int w)
{
    e[cnt].v = v;
    e[cnt].w = w;
    e[cnt].Next = Head[u];
    Head[u] = cnt++;
}

int spfa()
{
    for(int i=0; i<=E; i++)
        dist[i] = -INF;
    met(vis, 0);
    queue<int> Q;
    Q.push(S);
    vis[S] = 1;
    dist[S] = 0;
    while(!Q.empty())
    {
        int p = Q.front();Q.pop();
        vis[p] = 0;
        for(int i=Head[p]; i!=-1; i=e[i].Next)
        {
            int q = e[i].v;
            if(dist[q] < dist[p]+e[i].w)///最长路;
            {
                dist[q] = dist[p]+e[i].w;
                if(!vis[q])
                {
                    vis[q] = 1;
                    Q.push(q);
                }
            }
        }
    }
    return dist[E];
}

int main()
{
    int n, u, v, w;
    while(scanf("%d", &n) != EOF)
    {
        met(e, 0);
        met(Head, -1);
        cnt = 0;
        S = INF; E = -INF;///找到对应的起点和终点;
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d %d", &u, &v, &w);
            Add(u, v+1, w);///u可能等于0,所以v+1比较好;
            S = min(u, S);
            E = max(v+1, E);
        }
        for(int i=S; i<E; i++)///建立其他边,所以e要开3倍的N;
        {
            Add(i, i+1, 0);
            Add(i+1, i, -1);
        }
        int ans = spfa();
        printf("%d\n", ans);
    }
    return 0;
}

时间: 2024-10-10 23:51:05

Intervals---poj1201(差分约束系统)的相关文章

POJ1201 Intervals 【差分约束系统】

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21591   Accepted: 8122 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

【POJ 1201】 Intervals(差分约束系统)

[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23817   Accepted: 9023 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p

HDU1384 Intervals 【差分约束系统】

Intervals Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2880    Accepted Submission(s): 1048 Problem Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn

【POJ 1716】Integer Intervals(差分约束系统)

[POJ 1716]Integer Intervals(差分约束系统) Integer Intervals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13425   Accepted: 5703 Description An integer interval [a,b], a < b, is a set of all consecutive integers beginning with a and ending w

POJ - 1716 Integer Intervals(差分约束系统)

题目大意:给出N个区间,要求你找出M个数,这M个数满足在每个区间都至少有两个不同的数 解题思路:还是不太懂差分约束系统,数学不太好 借鉴了别人的思路,感觉有点DP思想 设d[i]表示[0,i-1]这个区间有d[i]个数满足要求 则给定一个区间[a,b],就有d[b + 1] - d[a] >= 2(b + 1是因为b也算在区间内) 将其转换为d[a] - d[b + 1] <= -2,这是第一个式子 接着在区间[i,i+1]中满足 d[i + 1] - d[i] >= 0 转换为 d[i

POJ1201 Intervals【差分约束系统】

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

poj 1201 Intervals(差分约束系统)(困难)

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23205   Accepted: 8764 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

POJ1201:Intervals【差分约束】

题目大意:给出N个闭区间,每个区间给出一个ci值,让你找出最小的数集Z使得每个闭区间都有不少于ci个Z中的元素,求card(Z) 思路:06年集训队论文<浅析差分约束系统>有详细的解题,设Sn为[0,n]中Z中元素的个数,ai ,bi为区间的两个端点,则可列出以下不等式: 0<=Sn-S(n-1)<=1 S(bi+1)-S(ai)>=ci 然后就可以用差分约束做了,顺便提一下,如果要把0<=Sn-S(n-1)<=1这些边加进图中的话边集会非常的大,以至于一开始邻接

poj1201 Intervals【差分约束+SPFA】

转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303365.html   ---by 墨染之樱花 题目链接:http://poj.org/problem?id=1201 题目描述:给出n个整数三元组(x,y,c),求一个整数集合Z,使其对每个前述三元组都满足在x与y之间(闭区间)的数的个数至少为c,求这个整数集合Z的最少有几个数 思路:利用差分约束系统求解.构造数列a1a2a3...an(其中ai只能为0或1,0表示i不在Z中,1表示i在

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