题目大意:
国王有一个傻儿子,只会判断在给出的序列S={a1,a2,a3,a4...ai...at}中,ai+a(i+1)+a(i+2)+...+a(i+n)<ki或ai+a(i+1)+a(i+2)+...+a(i+n)>ki,其中测试数据中给出的gt是'>',lt是'<'.有时候这个傻儿子连这也会判断错,当他错了时他不能说自己错(因为是国王的儿子嘛),所以他需要构造一个为序列S1来替代序列S 。问有没有这样一个序列。
此题我是用SPFA实现的。用SPFA实现要注意的问题都是些老问题:
1、图可能不连通,需要提前把所有点加入队列。
2、要判断是否有环(最长路的正环和最短路的负环)。
下面是代码:
#include <stdio.h>
#include <queue>
using namespace std;
#define inf 0x7fffffff
struct node
{
int to,w,next;
} edge[1005];
int dis[205],head[205],cnt,c[205],n,m;
bool vis[205];
void init()
{
cnt=0;
for(int i=0; i<205; i++)
{
head[i]=-1;
dis[i]=0;
}
}
void add(int u,int v,int w)
{
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
cnt++;
}
bool spfa()
{
queue <int>q;
int i;
for(i=0; i<=n; i++)
{
q.push(i);
vis[i]=true;
c[i]=1;
}
while(!q.empty())
{
int p,t=q.front();
q.pop();
p=head[t];
vis[t]=false;
while(p!=-1)
{
if(dis[edge[p].to]>dis[t]+edge[p].w)
{
dis[edge[p].to]=dis[t]+edge[p].w;
if(!vis[edge[p].to])
{
vis[edge[p].to]=true;
q.push(edge[p].to);
c[edge[p].to]++;
if(c[edge[p].to] > 24)
{
return false;
}
}
}
p=edge[p].next;
}
}
return true;
}
int main()
{
while(scanf("%d",&n),n)
{
scanf("%d",&m);
init();
int i,j,n,a,s,e,w;
char c[5];
for(i=0; i<m; i++)
{
scanf("%d%d%s%d",&s,&e,c,&w);
if(c[0]=='g')
{
add(s+e,s-1,-w-1);
}
else
{
add(s-1,s+e,w-1);
}
}
if(!spfa())
{
puts("successful conspiracy");
}
else
{
puts("lamentable kingdom");
}
}
return 0;
}