POJ 2983 (差分约束)

来源:互联网 发布:大数据应用于电力工程 编辑:程序博客网 时间:2024/05/16 12:25
Is the Information Reliable?
Time Limit: 3000MS Memory Limit: 131072KTotal Submissions: 11567 Accepted: 3661

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 4P 1 2 1P 2 3 1V 1 3P 1 3 15 5V 1 2V 2 3V 3 4V 4 5V 3 5

Sample Output

UnreliableReliable

Source

POJ Monthly--2006.08.27, Dagger

题意:n个点,m个约束条件。P: u v w 表示u点距v点w。V: u v 表示u点距v点至少为1。问你这些信息是否可靠,也就是说有没有矛盾的地方。

分析:写了一个Bellman-Ford算法。注意图的连通性。

code:

#include<stdio.h>#define INF 1e9int cnt;struct Edge{    int from, to, cost;}e[200010];void add(int u, int v, int w){    e[cnt].from = u;    e[cnt].to = v;    e[cnt++].cost = w;}int main(){    int n, m, d[1010];    char c;    while(~scanf("%d%d", &n,&m))    {        cnt = 0;        for(int i=0; i<m; i++)        {            getchar();            scanf("%c", &c);            int A, B, D;            if(c == 'P')            {                scanf("%d%d%d", &A,&B,&D);                add(A,B,-D);                add(B,A,D);            }            else            {                scanf("%d%d", &A,&B);                add(A,B,-1);            }        }        for(int i=1; i<=n; i++) d[i] = 0; //原点有可能不与负环连通        bool update; //所以将初始值全赋值为0,这样负环就一定能被查出,因为此时图是连通的        for(int j=0; j<n; j++)        {            update = false;            for(int i=0; i<cnt; i++)            {                if(d[e[i].from]+e[i].cost < d[e[i].to])                {                    d[e[i].to] = d[e[i].from]+e[i].cost;                    update = true;                }            }            if(!update) break;        }        if(update) puts("Unreliable");        else puts("Reliable");    }    return 0;}



0 0
原创粉丝点击