zoukankan      html  css  js  c++  java
  • Is the Information Reliable?(差分约束)

    Description

    The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years ago. Draco established a line of defense called Grot. Grot is a straight line with N defense stations. Because of the cooperation of the stations, Zibu’s Marine Glory cannot march any further but stay outside the line.

    A mystery Information Group X benefits form selling information to both sides of the war. Today you the administrator of Zibu’s Intelligence Department got a piece of information about Grot’s defense stations’ arrangement from Information Group X. Your task is to determine whether the information is reliable.

    The information consists of M tips. Each tip is either precise or vague.

    Precise tip is in the form of P A B X, means defense station A is X light-years north of defense station B.

    Vague tip is in the form of V A B, means defense station A is in the north of defense station B, at least 1 light-year, but the precise distance is unknown.

    Input

    There are several test cases in the input. Each test case starts with two integers N (0 < N ≤ 1000) and M (1 ≤ M ≤ 100000).The next M line each describe a tip, either in precise form or vague form.

    Output

    Output one line for each test case in the input. Output “Reliable” if It is possible to arrange N defense stations satisfying all the M tips, otherwise output “Unreliable”.

    Sample Input

    3 4
    P 1 2 1
    P 2 3 1
    V 1 3
    P 1 3 1
    5 5
    V 1 2
    V 2 3
    V 3 4
    V 4 5
    V 3 5

    Sample Output UnreliableReliable


    题意:有N个车站,给出一些点的精确信息和模糊信息,精确信息给出两点的位置和距离,模糊信息给出两点的位置,但距离大于等于一。试确定是否所有的信息满足条件;

     思路:对于精确信息,可以得出两个差分条件,b-a = c;可以化为b-a >= c && a - b <= -c;(因为是精确信息,故要建立双向边)

    对于模糊信息,只能得出一个差分条件,可以化为 b - a <= 1;所以a <= b-1;说明b到a有一条长度为-1的边;(模糊信息,建立单向边)

    WA了N次,最终不知道为什么。看到别人的博客里说Bellman_ford判负环比SPFA简单,它不用考虑不连通的情况,而SPFA要考虑是否连通,保证从源点开始,能到达各个顶点,这样才能保证差分约束里的各个不等式成立。因为要是源点到达不了某个顶点的话(即图是不连通的),那么从该顶点就无法入队,导致从该顶点出发的所有不等式,都没有得到检查,因此要添加一个超级源点,而Bellman_ford不需要添加源点,每个顶点都能被松弛n-1次。

     1 #include<stdio.h>
     2 #include<string.h>
     3 const int maxn = 210000;
     4 const int INF = 0x3f3f3f3f;
     5 struct node
     6 {
     7     int u,v,w;
     8 }edge[maxn];
     9 int dis[maxn];
    10 int n,m,cnt;
    11 //普通的Bellman_ford算法
    12 bool Bellman_ford()
    13 {
    14     bool flag;
    15     for(int i = 1; i <= n; i++)
    16         dis[i] = INF;
    17     for(int i = 1; i <= n; i++)
    18     {
    19         flag = false;
    20         for(int j = 0; j < cnt; j++)
    21         {
    22             if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w)
    23             {
    24                 dis[edge[j].v] = dis[edge[j].u] + edge[j].w;
    25                 flag = true;
    26             }
    27         }
    28         if( !flag )
    29             break;
    30     }
    31     for(int j = 0; j < cnt; j++)
    32     {
    33         if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w)
    34             return true;
    35     }
    36     return false;
    37 }
    38 
    39 int main()
    40 {
    41     int u,v,w;
    42     char ch;
    43     while(scanf("%d %d",&n,&m)!= EOF)
    44     {
    45         cnt = 0;
    46         for(int i = 0; i < m; i++)
    47         {
    48             getchar();
    49             scanf("%c",&ch);
    50             if(ch == 'P')
    51             {
    52                 scanf("%d %d %d",&u,&v,&w);//双向边
    53                 edge[cnt].u = u;
    54                 edge[cnt].v = v;
    55                 edge[cnt++].w = w;
    56 
    57                 edge[cnt].u = v;
    58                 edge[cnt].v = u;
    59                 edge[cnt++].w = -w;
    60 
    61             }
    62             else
    63             {
    64                 scanf("%d %d",&u,&v);//单向边
    65                 edge[cnt].u = v;
    66                 edge[cnt].v = u;
    67                 edge[cnt++].w = -1;
    68             }
    69         }
    70         if(Bellman_ford())
    71             printf("Unreliable
    ");
    72         else printf("Reliable
    ");
    73     }
    74     return 0;
    75 }
    View Code
  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/LK1994/p/3450353.html
Copyright © 2011-2022 走看看