转换为前缀和相减,即可得出差分约束
#include <cstring>
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 1005
int mp[maxn][maxn];
int d[maxn];
int n , m ;
struct node
{
int u,v,w;
};
node data[10005];
void deal()
{
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
if(d[data[j].u]+data[j].w<d[data[j].v]){
d[data[j].v]=d[data[j].u]+data[j].w;
}
}
}
for(int j=0;j<m;j++)
if(d[data[j].u]+data[j].w < d[data[j].v]) {
printf("successful conspiracy\n");
return ;
}
printf("lamentable kingdom\n");
}
int main()
{
while( cin >> n && n )
{
cin >> m;
for(int i = 0 ; i < m ; ++i){
int a,b,d;
char c[5];
scanf("%d %d %s %d",&a,&b,c,&d);
if( c[0] == 'g' ){
data[i].u = a + b;
data[i].v = a - 1;
data[i].w = -d - 1;
}
else
{
data[i].u = a - 1;
data[i].v = a + b;
data[i].w = d - 1;
}
}
deal();
}
}