POJ 1364 King
题目大意:
国王有一个傻儿子,只会判断在给出的序列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; }