题意:有一些关于点的信息,大概如下。P A B C 表示点A在点B的北方且与B相距C。 V A B 表示点A在B的北方,但是不清楚具体的距离(A-B>=1)。
题解:A-B=C转换成A-B>=C和A-B<=C就可以了。
#include <iostream>
using namespace std;
#define N 200005
#define INF 99999999
int n, m, size;
bool mark[N];
int head[N], dis[N];
int que[N], inque[N];
struct Edge { int v, w, next; };
Edge edge[N];
bool Spfa()
{
memset(mark,0,sizeof(mark));
memset(inque,0,sizeof(inque));
for ( int i = 0; i <= n; i++ )
dis[i] = INF;
int u, v, front, rear;
front = rear = 0;
mark[0] = true;
inque[0]++;
dis[0] = 0;
que[rear] = 0;
rear = ( rear + 1 ) % N;
while ( front != rear )
{
u = que[front];
front = ( front + 1 ) % N;
mark[u] = false;
for ( int i = head[u]; i; i = edge[i].next )
{
v = edge[i].v;
if ( dis[v] > dis[u] + edge[i].w )
{
dis[v] = dis[u] + edge[i].w;
if ( ! mark[v] )
{
que[rear] = v;
rear = ( rear + 1 ) % N;
mark[v] = true;
inque[v]++;
if ( inque[v] >= n+1 ) return false;
}
}
}
}
return true;
}
void add ( int u, int v, int w )
{
size++;
edge[size].v = v;
edge[size].w = w;
edge[size].next = head[u];
head[u] = size;
}
int main()
{
char ch;
int a, b, c;
while ( scanf("%d%d",&n, &m) != EOF )
{
size = 0;
memset(head,0,sizeof(head));
while ( m-- )
{
getchar();
scanf("%c",&ch);
if ( ch == 'P' )
{
scanf("%d%d%d",&a,&b,&c);
add ( a, b, -c );
add ( b, a, c );
}
else
{
scanf("%d%d",&a,&b);
add ( a, b, -1 );
}
}
for ( int i = 1; i <= n; i++ )
add ( 0, i, 0 );
if ( Spfa() )
printf("Reliable\n");
else
printf("Unreliable\n");
}
return 0;
}