poj1201(差分约束)

题很水。。。但我被坑惨了

。。。。。。。。

。。。。。.。。。。。

。。。。。。。

构成差分约束系统时,1.如果在所有点外添加一个超级源0号点,并使得超级源到所有其他点的距离为0,那么最终求出的0号点到其他所有原始点的最短距离就是本系统的一个可行解,且可行解之间的差距最小.      2.如果初始时不添加超级源,只是将原始点的初始距离设为INF,且令其中一个原始点的初始距离为0,然后求该点到其他所有点的最短距离,那么最短距离的集合就是一个可行解,且该可行解两两之间的差距最大.注意方案2只能在该问题一定存在解的时候即肯定不存在负权环的时候用.否则从1号点到其他点没有路,但是其他点的强连通分量中有负权环,这样根本探测不到错误) 所以我们需要采取方案1.

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

const int maxn=50000+10;
const int maxm=500000+10;
const int nil=1e9;

struct my{
       int next;
       int v;
       int w;
};

queue<int>Q;
int maxx=-1;
int adj[maxn],fa,n,m,d[maxn],inq[maxn];
my bian[maxm];

void myinsert(int u,int v,int w){
     bian[++fa].v=v;
     bian[fa].next=adj[u];
     bian[fa].w=w;
     adj[u]=fa;
}

int spfa(int s){
    for (int i=0;i<=maxx;i++) d[i]=nil;
    d[s]=0;
    Q.push(s);
    inq[s]=true;
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        inq[u]=false;
        for (int i=adj[u];i!=-1;i=bian[i].next){
            int v=bian[i].v;
            if(d[v]>d[u]+bian[i].w){
                d[v]=d[u]+bian[i].w;
                if(!inq[v]){
                    Q.push(v);
                    inq[v]=true;
                }
            }
        }
    }
    return d[maxx]-d[9];
}

int main(){
    memset(adj,-1,sizeof(adj));
    memset(bian,-1,sizeof(bian));
    scanf("%d",&m);
    int u,v,w;
    for (int i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        u+=10;
        v+=10;
        maxx=max(maxx,v);
        myinsert(v,u-1,-w);
    }
    for (int i=10;i<=maxx;i++){
        myinsert(i,i-1,0);
        myinsert(i-1,i,1);
        myinsert(0,i,0);
    }
    myinsert(0,9,0);
    printf("%d\n",spfa(0));
return 0;
}

原文地址:https://www.cnblogs.com/lmjer/p/9368297.html

时间: 2024-10-10 07:07:53

poj1201(差分约束)的相关文章

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差分约束

#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorithm> #include<vector> #include<map> #include<set> #i

poj1201差分约束模板题

http://poj.org/problem?id=1201 题意是给你n个区间,每个区间有一个边界[a,b],以及一个整数c 要满足每个区间[a,b]都至少有c个元素 解题方法就是构造差分约束公式 (a-1)-b<=-c 建立一条边从b到a-1,权值为-c 然后还要加上两个条件 (i+1)-i>=0 -> i-(i+1)<=0 (i+1)-i<=1 #include <cstdio> #include<cstring> #include<ios

POJ1201 差分约束

给定ai,bi, ci 表示区间[ai,bi]内至少有ci个点, 要求对于所有给定的ai,bi,ci,  至少多少个点才能满足题目的条件 重做这一题学到的一点是, 可以设变量来表示一些东西,然后才能找出约束的条件,  s[i]表示区间0到i内有多少个点,  那么s[bi] - s[ai-1] >= ci 就是约束的条件 当然了,也有隐藏的条件  1>= s[i] - s[i-1] >=0 可以用最长路来求这一题,最短路当然也是可以的. #include <stdio.h> #

POJ1201 Intervals 【差分约束】

题目链接 POJ1201 题解 差分约束 令\(a[i]\)表示是否选择\(i\),\(s[i]\)表示\(a[i]\)的前缀和 对\(s[i] \quad i \in [-1,50000]\)分别建立一个点 首先有 \[s[i] - s[i - 1] \ge 0\] \[s[i] - s[i - 1] \le 1\] 然后就是限制条件 \[s[b] - s[a - 1] \ge c\] 然后就没了 用\(spfa\)跑最长路 由于题目保证有解,所以不会存在正环 复杂度上界是\(O(nm)\)的

POJ1201 Intervals【SPFA】【差分约束】

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

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 (差分约束)

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 wh

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 值不会多余增大,也就满足题意要