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

    Time Limit: 3000MS Memory Limit: 131072K

    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

    Unreliable
    Reliable

    Source

    POJ Monthly–2006.08.27, Dagger

    题意:有n个防御塔和m个情报,判断这些情报是不是可信,情报有两种:(1):P u v w 表示u在v的w光年处 。(2):V u v 表示u在v北的一光年之外(包括一光年)

    思路:Dis[i]表示i在源点北面Dis[i]光年,所以对于(1):P uv w 可以表示为Dis[u]-Dis[v]=w,所以Dis[u]-Dis[v]>=w且Dis[v]-Dis[u]>=-w,对于(2): V u v 可以表示为Dis[u]-Dis[v]>=1,所以建立图,跑最长路,判断是不是有矛盾即正环,我用的
    SPFA,要判断自环。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <queue>
    #include <string>
    #include <vector>
    #include <stack>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    
    const int MaxN = 1100;
    
    const int MaxM = 100100;
    
    typedef struct node
    {
        int v,w,next;
    }Line;
    
    Line Li[MaxM*2];
    
    int Head[MaxN],top;
    
    int Dis[MaxN],Du[MaxN];
    
    bool vis[MaxN];
    
    int n,m;
    
    void AddEdge(int u,int v,int w)
    {
        Li[top].v = v ; Li[top].w = w;
    
        Li[top].next = Head[u];
    
        Head[u] = top++;
    }
    
    bool SPFA()
    {
        queue<int>Q;
    
        for(int i=1;i<=n;i++)//相当于有一个超级源点
        {
            Dis[i] = 0;
    
            vis[i]=true;
    
            Du[i]=1;
    
            Q.push(i);
        }
    
        while(!Q.empty())
        {
            int u = Q.front();
    
            Q.pop();
    
            if(Du[u]>n)//有矛盾
            {
                return false;
            }
            for(int i = Head[u];i!=-1;i = Li[i].next)
            {
                int v = Li[i].v;
    
                if(Dis[v]<Dis[u]+Li[i].w)
                {
                    Dis[v] = Dis[u]+Li[i].w;
    
                    if(!vis[v])
                    {
                        Q.push(v);
                        vis[v] = true;
                        Du[v]++;
                    }
                }
            }
            vis[u]=false;
        }
        return true;
    }
    
    int main()
    {
        char Op[5];
    
        int u,v,w;
    
        while(~scanf("%d %d",&n,&m))
        {
            memset(Head,-1,sizeof(Head));
    
            top = 0;
    
            bool flag=false;
    
            for(int i=1;i<=m;i++)
            {
                scanf("%s",Op);
    
                if(Op[0]=='P')
                {
                    scanf("%d %d %d",&u,&v,&w);
    
                    if(u==v&&w!=0)//自环
                    {
                        flag=true;
                    }
    
                    AddEdge(u,v,w);
    
                    AddEdge(v,u,-w);
                }
                else
                {
                    scanf("%d %d",&u,&v);
    
                    if(u==v)
                    {
                        flag=true;
                    }
    
                    AddEdge(u,v,1);
                }
            }
            if(flag||!SPFA())
            {
                printf("Unreliable
    ");
            }
            else
            {
                printf("Reliable
    ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    让Extjs EditorGridPanel 编辑时支持方向键
    开发WebApp之PC客户端
    windows下mysql忘记root密码的解决方法
    TortoiseSVN使用svn+ssh协议连接服务器时重复提示输入密码
    jQuery Mobile页面跳转后未加载外部JS原因分析及解决
    在CentOS中安装与配置SVN的方法
    设置VMWARE通过桥接方式使用主机无线网卡上网
    关于sp_executesql与exec执行动态sql的区别--转载RascallySnake
    TreeView 点击触发父节点、子节点的连锁反应选中与取消
    Winform客户端发布与升级:ClickOnce
  • 原文地址:https://www.cnblogs.com/juechen/p/5255870.html
Copyright © 2011-2022 走看看