POJ 1364 King

本文介绍了一种使用SPFA算法解决特定序列判断问题的方法。通过构造新的序列S1来代替原始序列S,解决了国王傻儿子无法正确判断序列中元素求和与给定阈值的关系问题。文章详细解释了SPFA算法的实现细节,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

国王有一个傻儿子,只会判断在给出的序列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、要判断是否有环(最长路的正环和最短路的负环)。


//china no.1
#include <vector>
#include <iostream>
#include <string>
#include <map>
#include <stack>
#include <cstring>
#include <queue>
#include <list>
#include <stdio.h>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <iomanip>
#include <cctype>
#include <sstream>
#include <functional>
using namespace std;

#define pi acos(-1)
#define endl '\n'
#define rand() srand(time(0));
#define me(x) memset(x,-1,sizeof(x));
#define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++)
#define close() ios::sync_with_stdio(0);
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL LINF=0x3f3f3f3f3f3f3f3fLL;
const int dx[]={-1,0,1,0,-1,-1,1,1};
const int dy[]={0,1,0,-1,1,-1,1,-1};
const int maxn=1e5+5;
const int maxx=1e3+100;
const double EPS=1e-7;
const int MOD=10000007;
#define mod(x) ((x)%MOD);
template<class T>inline T min(T a,T b,T c) { return min(min(a,b),c);}
template<class T>inline T max(T a,T b,T c) { return max(max(a,b),c);}
template<class T>inline T min(T a,T b,T c,T d) { return min(min(a,b),min(c,d));}
template<class T>inline T max(T a,T b,T c,T d) { return max(max(a,b),max(c,d));}
//typedef tree<pt,null_type,less< pt >,rb_tree_tag,tree_order_statistics_node_update> rbtree;
long long gcd(long long a , long long b){if(b==0) return a;a%=b;return gcd(b,a);}
#define FOR(x,n,i) for(int i=x;i<=n;i++)
#define FOr(x,n,i) for(int i=x;i<n;i++)
#define W while

int n,x,y,k,m,a,ni,ki,b,c;
char oi[5];
struct node
{
    int to,w,next;
}E[maxx*40];
int head[maxx];
int d[maxx],inq[maxx],num[maxx];
inline int Scan()
{
    int res=0,ch,flag=0;
    if((ch=getchar())=='-')flag=1;
    else if(ch>='0' && ch<='9')res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-'0';
    return flag ? -res : res;
}
void init()
{
    memset(head,-1,sizeof(head));
    k=0;
    for(int i=0;i<maxx;i++)
    {
        inq[i]=0;
        d[i]=INF;
    }
}

void add(int from,int to,int w)
{
    E[k].to=to;
    E[k].w=w;
    E[k].next=head[from];
    //cout<<E[k].to<<"  "<<E[k].w<<endl;
    head[from]=k++;

}
int SPFA()
{
    int s=n+1;
    queue<int >Q;
    Q.push(s),d[s]=0,inq[s]=1;
    me(num);
    while(!Q.empty())
    {
        int now=Q.front();
        //cout<<now<<endl;
        Q.pop();
        inq[now]=0;
        ++num[now];
        if(num[now]>n+1) return 0;
        for(int i=head[now];i!=-1;i=E[i].next)
        {
            int v=E[i].to,w=E[i].w;
            if(d[v]>d[now]+w)
            {
                d[v]=d[now]+w;
                if(inq[v]==1) continue;
                inq[v]=1;
                Q.push(v);
            }
        }
    }
    return 1;
}
int main()
{
    W(n=Scan())
    {
        init();
        if(n==0) return 0;
        m=Scan();
        W(m--)
        {
            scanf("%d %d %s %d",&a,&b,oi,&ki);
            b+=a;
            if(oi[0]=='g')
                add(b,a-1,-ki-1);
            else add(a-1,b,ki-1);
        }
        FOR(0,n,i)
            add(n+1,i,0);
        int t=SPFA();
        if(t==0)
            puts("successful conspiracy");
        else puts("lamentable kingdom");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值