约束条件:
如果是gt s[a-1]-s[a+b]<=-c-1;
如果是lt s[a+b]-s[a-1]<=c-1;
此外,新加的原点与其他点的leth为零。n+1为原点。
#include<stdio.h>
#include<string.h>
#define MX 10000000
int n,m,dist[110],vst[110],list[110],f[1000000];
char ss[5];
bool visit[110];
struct point
{
int v,leth;
int next;
}eg[1000010];
int SPFA()
{
memset(vst,0,sizeof(vst));
memset(visit,0,sizeof(visit));
for(int i=0;i<=n;i++)
dist[i]=MX;
dist[n+1]=0;
int head=0,tail=1;
f[1]=n+1;
vst[n+1]++;
visit[n+1]=true;
while(head<tail)
{
int now=f[++head];
visit[now]=false;
for(int i=list[now];i!=-1;i=eg[i].next)
{
if(dist[now]+eg[i].leth<dist[eg[i].v])
{
dist[eg[i].v]=dist[now]+eg[i].leth;
if(!visit[eg[i].v])
{
f[++tail]=eg[i].v;
vst[eg[i].v]++;
visit[eg[i].v]=true;
}
if(vst[eg[i].v]>n)
return -1;
}
}
}
return 1;
}
int main()
{
while(scanf("%d%d",&n,&m)&&n)
{
int pos=0;
memset(list,-1,sizeof(list));
for(int i=1;i<=n;i++)
{
eg[pos].v=i;
eg[pos].leth=0;
eg[pos].next=list[n+1];
list[n+1]=pos++;
}
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%s%d",&a,&b,ss,&c);
if(ss[0]=='g')
{
eg[pos].leth=-c-1;
eg[pos].v=a-1;
eg[pos].next=list[a+b];
list[a+b]=pos++;
}
else
{
eg[pos].leth=c-1;
eg[pos].v=a+b;
eg[pos].next=list[a-1];
list[a-1]=pos++;
}
}
if(SPFA()==1)
printf("lamentable kingdom\n");
else
printf("successful conspiracy\n");
}
return 0;
}