题目链接请戳 这里
解题思路
需要知道差分约束系统
代码
#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; }