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
  • 相关阅读:
    Python3学习笔记27-ConfigParser模块
    Python3学习笔记26-unittest模块
    HTML学习笔记09-列表
    HTML学习笔记08-表格
    [hdu1402]A * B Problem Plus(FFT模板题)
    [bzoj2179]FFT快速傅立叶
    [bzoj3884]上帝与集合的正确用法
    [ural1132]Square Root(cipolla算法)
    MD5算法的c++实现
    DES算法的c++实现
  • 原文地址:https://www.cnblogs.com/LK1994/p/3450353.html
Copyright © 2011-2022 走看看