poj2983(差分约束系统)

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

题意:一天南北线上有n个防御站,给出他们之间的位置关系,问有没有可能存在这样一种位置布置符合所给的位置关系。关系有两种,一种是 P A B X,表示A在B北边X光年的位置,V A B表示A在B北边至少1光年位置。

解法:查分约束。dist[A]-dist[B]>=X,表示A在B北边至少X光年位置。变形为:dist[B]<=dist[A]-X;所以A指向B有条权值为-X的边。这也是最短路松弛原理的关系。对于A-B=X,则建两条边dist[B]<=dist[A]-X,dist[A]<=dist[B]+X。

SPFA时候如果存在负权环则说明不符合实际情况。

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=1010;
const LL INF=0x3FFFFFFF;
struct point
{
    int u;
    int dist;
};
vector<point> vec[Max];
int dis[Max];
int que[Max*Max];
int rem[Max];
int n,m;
bool spfa1()
{
    memset(dis,0x3f,sizeof dis);
    memset(rem,0,sizeof rem);
    que[0]=0;
    int left=0,right=1;
    dis[0]=0;
    while(left<right)
    {
        int t=que[left++];
        for(int i=0; i<vec[t].size(); i++)
        {
            if(dis[vec[t][i].u]>dis[t]+vec[t][i].dist)
            {
                dis[vec[t][i].u]=dis[t]+vec[t][i].dist;
                que[right++]=vec[t][i].u;
                rem[vec[t][i].u]++;
                if(rem[vec[t][i].u]>n+2)
                    return false;
            }
        }
    }
    return true;
}

int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        vec[0].clear();
        for(int i=1; i<=n; i++)
        {
            vec[i].clear();
            point p;
            p.u=i;
            p.dist=1;
            vec[0].push_back(p);
        }
        bool flag=1;
        for(int i=0; i<m; i++)
        {
            char c;
            getchar();
            scanf("%c",&c);
            // getchar();
            if(c=='P')
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                point p;
                p.dist=-c;
                p.u=b;
                vec[a].push_back(p);
                p.dist=c;
                p.u=a;
                vec[b].push_back(p);
            }
            else
            {
                int a,b;
                scanf("%d%d",&a,&b);
                point p;
                p.dist=-1;
                p.u=b;
                vec[a].push_back(p);
            }
        }
        if(spfa1())
            puts("Reliable");
        else
            puts("Unreliable");
    }
    return 0;
}
时间: 2024-10-05 04:33:16

poj2983(差分约束系统)的相关文章

差分约束系统

差分约束系统是指一系列不等式: $$ X_j - X_i \le C_{ij}(1\le i, j \le n) $$ 当然 i,j 不必取遍 1-n,而且在扩展的状况下,对于每个(i,j),可以由多个 $C_{ij}$,但是我们很容易把它们化成一个不等式. 在求解不等式组之前,我们可以分析一下这个不等式组的性质. 1. 这个不等式组是可以无解的,比如: $$X_1 - X_2 \le -1 \\ X_2 - X_3 \le -1 \\ X_3 - X_1 \le -1$$ 否则三个不等式相加得

poj2983——差分约束,bellman_ford

poj2983——差分约束,bellman_ford Is the Information Reliable? Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 11560   Accepted: 3658 Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years ago. Draco

UVa 515 - King (差分约束系统 + SPFA求带负权最短路)

下面是差分约束系统的详细介绍,以及解决方法~ 摘抄自 xuezhongfenfei(他好像也是转的....) 差分约束系统 X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5 X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于).这样的不等式组

差分约束系统 初见

今天初次学习差分约束系统,很神奇的东西 定义: 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints).亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法. 求解差分约束系统,可以转化成图论的单源最短路径(或最长路径)问题. 其实在一些问题中需求最小值或最大值,同时需要满足一系列的不等式关系,这样就可以用到差分约束系统了,对于求最小值的问

ZOJ 3668 Launching the Spacecraft (差分约束系统,最短路)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668 题意: 给一个初始值为0的长度为n的区间,给m个约束l,r,a,b,表示从l到r的区间和>=a且<=b,且每个数的范围为-10000~10000,问这个区间的每个数是多少,要求数尽可能大,且序列字典序最大. 方法: 差分约束系统,以前缀和表示一个节点a[i] 建图:根据下面约束条件建图 a[i]-a[i-1]<=10000 a[i-1]-a[i]&l

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

题目地址:POJ 2983 这题刚上来完全不知道跟差分约束系统有什么关系.....后来发现只要判个负环就可以.. 因为假如有冲突的话会形成一个负环.之所以建图加上一个正值一个负值,是因为这样的话,像1 2 4和1 2 3这样的数据就会形成一个负环.这个方法还是很巧妙的...然后对于V的那些不清楚的位置,就会跟P的那些等式联立形成一个不等式,然后在用最短路判环的过程中就用松弛来解决. 代码如下: #include <iostream> #include <cstdio> #inclu

【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

差分约束系统--详讲

------------差分约束题目请戳:差分约束题集暨报告 总的开说差分约束问题就是给出一系列不等式然后求问某一式子的最大值或者最小值. 差分约束问题具体解释: 比方有这样一组不等式: X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5                   不等式组(1) X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3 全都是

浅谈差分约束系统——图论不等式的变形

浅谈差分约束系统——图论不等式的变形 ----yangyaojia 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 一.定义 如若一个系统由n个变量和m个不等式组成,并且这m个不等式对应的系数矩阵中每一行有且仅有一个1和-1,其它的都为0,这样的系统称为差分约束( difference constraints )系统. 二.分析 简单来说就是给你n个变量,给m个形如x[i]-x[j]≥k①或x[i]-x[j]≤k②.求两

UVA11478 Halum [差分约束系统]

https://vjudge.net/problem/UVA-11478 给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权值减小d,把所有以v为起点的边的权值增加d,最后让所有边的权值的最小值大于零且尽量大. 该死书上翻译错了 >0不是非负 WA好几次因为这个 考虑每条边的约束,di表示i的halum量 w-dv+du>0 dv-du<w 但求解这个差分约束系统只是让这组不等式成立,最长路和最短路控制的都是单个d的最值而不是最小值最大 那