uva515

题目链接请戳 这里

 

解题思路

需要知道差分约束系统

 

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110
#define M 10010
#define INF 1e9
using namespace std;

int v[M], u[M], w[M], first[N], nex[M];
int n, m, e;
int d[N];

void addedge(int x, int y, int k)
{
    u[e] = x; v[e] = y; w[e] = k;
    nex[e] = first[u[e]];
    first[u[e]] = e;
    e++;
}

bool Bellman_ford()
{
    for (int i = 0; i <= n + 2; i++) d[i] = (i == n + 2) ? 0 : INF;
    for (int i = 0; i < n + 2; i++) {
        for (int k = 0; k < e; k++) {
            int x = u[k], y = v[k];
            if (w[k] < INF) d[y] = min(d[y], d[x] + w[k]);
        }
    }
    for (int k = 0; k < e; k++) {
        int x = u[k], y = v[k];
        if (w[k] < INF && d[y] > d[x] + w[k]) return false;
    }
    return true;
}

int main()
{
    while (scanf("%d", &n) == 1 && n) {
        scanf("%d", &m); e = 0;
        for (int i = 0; i < m; i++) {
            int x, y, k;
            char s[10];
            scanf("%d%d%s%d", &x, &y, s, &k);
            if (strcmp(s, "gt") == 0)
                addedge(x + y, x - 1, -k - 1);
            else
                addedge(x - 1, x + y, k - 1);
        }
        for (int i = 0; i <= n + 1; i++) addedge(n + 2, i, 0);
        Bellman_ford() ? printf("lamentable kingdom\n") : printf("successful conspiracy\n");
    }
    return 0;
}

 

posted @ 2016-11-09 19:43  啊嘞  阅读(201)  评论(0编辑  收藏  举报