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 Vague tip is in the form of 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个约束条件。P: u v w 表示u点距v点w。V: u v 表示u点距v点至少为1。问你这些信息是否可靠,也就是说有没有矛盾的地方。
分析:写了一个Bellman-Ford算法。注意图的连通性。
code:
#include<stdio.h>
#define INF 1e9
int 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;
}