poj 1364 King hdu 1531 King

http://poj.org/problem?id=1364

http://acm.hdu.edu.cn/showproblem.php?pid=1531

差分约束 基本上就是 给你数列之间的一些大小限制

把它们 转化为点之间的限制条件 限制条件代表边

就变成最短路或最长路了 求的时候需判断有没有负环或正环

一般用 Bellmen_ford 写 还有就是效率更高一些的 SPFA

本题解释见代码注释

#include<iostream>

#include<cstdio>

#include<string>

#include<queue>

#include<stack>

#include<cstring>



using namespace std;

const int N=105;

struct node

{

    int si,ni,k;

}mem[N];

int dis[N];//前 i 项的和

int main()

{

    int n,m;

    while(scanf("%d",&n)!=EOF,n)

    {

        scanf("%d",&m);

        int l,r,k;

        char a[3];

        for(int i=0;i<m;++i)

        {

            scanf("%d%d%s%d",&l,&r,a,&k);

            if(a[0]=='g')//将其 转化为 dis[mem[i].si]+mem[i].k<=dis[mem[i].ni] 的限制条件

            {

               mem[i].si=l-1;mem[i].ni=l+r;

               mem[i].k=k+1;

            }

            else //同上

            {

               mem[i].si=l+r;mem[i].ni=l-1;

               mem[i].k=-k+1;

            }

        }

        memset(dis,0,sizeof(dis));

        bool OK=false;

        for(int w=0;w<=n;++w)//刚开始写了个 w<n 结果wa了一下午 原来

        {//由于前面的 l-1 是得点范围 变成了0--n 共n+1个点 所以循环层数要加一

            OK=true;

            for(int i=0;i<m;++i)

            {

                if(dis[mem[i].si]+mem[i].k>dis[mem[i].ni])

                {

                    OK=false;dis[mem[i].ni]=dis[mem[i].si]+mem[i].k;

                }

            }

            if(OK==true)

            break;

        }

        if(OK==true)

        {

            printf("lamentable kingdom\n");

        }

        else

        {

            printf("successful conspiracy\n");

        }

    }

    return 0;

}

 

你可能感兴趣的:(poj)