poj2983Is the Information Reliable?——差分约束

poj2983Is the Information Reliable?:http://poj.org/problem?id=2983

Is the Information Reliable?
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 12379 Accepted: 3898

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
题意:给出一些信息,P代表的是精确的信息;V代表的是不精确的信息。问得到的这些信息是否是可靠的。

思路,用差分约束来做,根据题意找出约束条件:d(u)-d(v)>=1;c>=d(u)-d(v)>=c.找一下最短路(当然不需要写出最短路)

这题最终要求的说通俗点就是判断一下有没有负环……

在做的时候由于题意没有理解好,导致在建边的时候建反了,wa了n发……

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <queue>


using namespace std;
#define INF 1000000007
#define maxn 100000


struct Edge
{
    int v;
    int w;
    int next;
} edge[maxn * 3];


int N,M,cnt = 0;
int sum[maxn],head[maxn],vis[maxn],d[maxn];


void Add(int u,int v,int w)
{
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt++;
}


bool spfa()
{
    memset(vis,0,sizeof(vis));
    memset(sum,0,sizeof(sum));
    for(int i = 0;i <= N;i++)d[i] = INF;
    int top = 0;
    queue<int>st;
    st.push(0);
    d[0] = 0;
    vis[0] = 1;
    while(!st.empty())
    {
        int x = st.front();
        st.pop();
        vis[x] = 0;
        for(int i = head[x];i != -1;i = edge[i].next)
        {
            if(d[edge[i].v] > d[x] + edge[i].w)
            {
                d[edge[i].v] = d[x] + edge[i].w;
                if(!vis[edge[i].v])
                {
                    vis[edge[i].v] = 1;
                    st.push(edge[i].v);
                    sum[edge[i].v]++;
                    if(sum[edge[i].v] > N)return false;       // 当入度大于顶点数说明存在负环了
                }
            }
        }
    }
    return true;
}
int main()
{
//    freopen("in.txt","r",stdin);
    int u,v,w;
    while(~scanf("%d%d",&N,&M))
    {
        cnt = 0;
        memset(head,-1,sizeof(head));
        while(M--)
        {
            char ss[10];
            scanf("%s%d%d",ss,&u,&v);
            if(ss[0] == 'P')
            {
                scanf("%d",&w);
                Add(u,v,-w);       // 就是在这弄反了……
                Add(v,u,w);       //
            }
            else Add(u,v,-1);
        }
        for(int i = 1;i <= N;i++)    // 添加了超级源点,共有N+1个点了
            Add(0,i,0);
        if(!spfa())printf("Unreliable\n");
        else printf("Reliable\n");
    }
    return 0;
}

对于求最短路还是最长路,一直混淆……

题目要求最小值,求最长路,约束条件化成d(v)-d(u)>=w(u,v)的形式;

题目要求最大值,求最短路,约束条件化成d(v)-d(u)<=w(u,v)的形式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值