http://poj.org/problem?id=2983

题意:给定两种约束关系

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.

d[i]表示i与0的距离,在p关系可表示为x <=d[b] - d[a]<=x   V关系可以表示为 d[b] - d[a] >= 1。 化简约束关系: P: d[b] - d[a] <= x    d[a] - d[b] <= -c  V: d[a] - d[b] <= -1

求最短路,判断是否存在bellman_ford。在做的时候,用了个memset初始化g结果一直tle,去掉后就ac了,看来以后尽量自己写训话出事化。

 

#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 100007
using namespace std;

struct node
{
    int u,v,w;
}g[maxn*100];
int len;
int n,m,dis[1005];
const int inf = 99999999;

void add(int u,int v,int w)
{
    g[len].u = u;
    g[len].v = v;
    g[len].w = w;
    len++;
}
bool bellman_ford(int s)
{
    int i,j;
    for (i = 1; i <= n; ++i) dis[i] = inf;
    dis[s] = 0;
    for (i = 1; i < n; ++i)
    {
        bool flag = false;
        for (j = 0; j < len; ++j)
        {
            int u = g[j].u,v = g[j].v,w = g[j].w;
            if (dis[v] > dis[u] + w)
            {
                dis[v] = dis[u] + w;
                flag = true;
            }
        }
        if (!flag) return true;
    }
    for (j = 0; j < len; ++j)
    {
        int u = g[j].u,v = g[j].v,w = g[j].w;
        if (dis[v] > dis[u] + w) return false;
    }
    return true;
}
int main()
{
    int i;
    int a,b,c;
    char op[3];
    while (~scanf("%d%d",&n,&m))
    {
        len = 0;
        for (i = 0; i < m; ++i)
        {
            scanf("%s%d%d",op,&a,&b);
            if (op[0] == 'P')
            {
                scanf("%d",&c);
                add(b,a,-c);
                add(a,b,c);
            }
            else
            {
                add(b,a,-1);
            }
        }
        if (bellman_ford(1)) printf("Reliable\n");
        else printf("Unreliable\n");
    }
    return 0;
}