简单的差分约束问题,给定若干个序列号从x到y的和的结果与某个数的比较。设num[x]表示前x个数字之和,序列下标从1开始,我们设置一个超级源点0。然后对应的某个区间的数字之和即可以表示为某两个数字之差。这样我们就可以转化为差分约束方程求解.还需要注意的一点就是要对右端的数字进行一下适当的变换,变>,< 为>= ,<=。程序如下:
#include<stdio.h>
#include<string.h>
#define MAXN 104
struct Node{
int s ;
int e ;
int w ;
}edge[MAXN];
int num[MAXN] ;
int n ;
int m ;
int len ;
bool read(){
scanf("%d" , &n) ;
//printf("%d\n" , n) ;
if(n == 0)
return 0 ;
scanf("%d" , &m) ;
int p ;
int q ;
int w ;
char str[3] ;
len = 0 ;
for(int i = 0 ; i < m ; i ++){
scanf("%d %d %s %d" , &p , &q , str , &w) ;
if(strcmp("gt" , str)==0){
edge[len].s = p + q ;
edge[len].e = p - 1 ;
edge[len].w = -1 - w ;
len ++ ;
}
else {
edge[len].s = p - 1 ;
edge[len].e = q + p ;
edge[len].w = w - 1 ;
len ++ ;
}
}
return 1 ;
}
bool bellman(){
int i ;
int j ;
for(i = 0 ; i <= n ; i ++){
for(j = 0 ; j < len ; j ++){
if(num[edge[j].e] > num[edge[j].s] + edge[j].w){
num[edge[j].e] = num[edge[j].s] + edge[j].w ;
}
}
}
for(j = 0 ; j < len ; j ++){
if(num[edge[j].e] > num[edge[j].s] + edge[j].w){
return 1 ;
}
}
return 0 ;
}
void work(){
memset(num , 0 , sizeof(num)) ;
if(bellman()){
puts("successful conspiracy") ;
}
else
puts("lamentable kingdom") ;
}
int main(){
while(read()){
work() ;
}
return 0 ;
}