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;
}


posted @ 2013-11-05 08:47  、小呆  阅读(116)  评论(0编辑  收藏  举报