PoJ 2983 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

Unreliable
Reliable


学到几个新细节
首先等式A+B=C可以拆解成A+B>=C并且A+B<=C
第二所有的最长路貌似都可以转化为最短路,这样一来直接memset一个0x3f就可以了


这题坑了我好久啊,我们其实是更新几次,所以应该在外面进行cnt的++


#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;

const int MAXN = 100;
int tail, head[MAXN], dis[MAXN], cnt[MAXN];
struct Line{ int to, nxt, flow; }line[ MAXN * MAXN ];
bool vis[MAXN];
void init() {
    tail = 0; 
    memset( head, 0, sizeof( head ) );
    memset( dis, 0, sizeof( dis ) );
}

void add_line( int from, int to, int flow ) {
    line[++tail].nxt = head[from];
    line[tail].to = to;
    line[tail].flow = flow;
    head[from] = tail;
}
bool SPFA( int S, int n ) {
    queue<int>q; while( !q.empty() ) q.pop();
    memset( dis, 0x3f, sizeof( dis ) );
    memset( cnt, 0, sizeof( cnt ) );
    memset( vis, false, sizeof( vis ) );
    dis[S] = 0; q.push( S ); cnt[S]++;
    vis[S] = true; 
    while( !q.empty() ) {
        int u = q.front(); q.pop(); vis[u] = false;
        for( register int i = head[u]; i; i = line[i].nxt ) {
            int v = line[i].to;
            if( dis[v] > dis[u] + line[i].flow ) {
                dis[v] = dis[u] + line[i].flow;
                if( vis[v] ) continue;
                vis[v] = true;
                q.push(v);
                cnt[v]++;
                if( cnt[v] > n ) {
                    return false;
                }
            }
        }
    }
    return true;
}
int main( ) { int n, m;
    while( scanf( "%d", &n ), n ) {
        scanf( "%d", &m ); int ff, tt, ww; char opt[10];
        init();
        for( register int i = 1; i <= m; i++ ) {
            scanf( "%d%d%s%d", &ff, &tt, opt, &ww );
            if( opt[0] == 'g' ) add_line( ff + tt + 1, ff,  - ww - 1 );
            else                add_line( ff, ff + tt + 1, ww - 1 );
        }
        for( register int i = 1; i <= n + 1; i++ ) add_line( 0, i, 0 );
        if( !SPFA( 0, n + 2 ) ) puts("successful conspiracy");
        else                    puts("lamentable kingdom");
    }
    return 0;
}

这里写图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值