POJ 1364 King【差分约束】

题意: 知道了一个序列a[1]..a[n] ,给出 m 个约束条件,

         ① st  sn  gt ki  表示a[st]+a[st+1]+..a[st+sn]>ki

         ② st  sn  lt  ki  表示a[st]+a[st+1]+..a[st+sn]<ki

          问是否存在这样的 a[i] 序列。

分析: 将上面的两个不等式等价转换建立差分约束系统

           将 ① 变为s[st-1]-s[st+en] < -ki <=-ki-1

           将 ② 变为s[st+en]-s[st-1] < ki <=ki-1

           求解这个差分约束系统,看最后有无冲突

// gt  dis[s[i].en]-dis[s[i].st-1]<=ki-1
// lt  dis[st]-dis[en]<=-ki-1
#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
struct node
{
    int st,en;
}q[105];
int dis[105];
int k[105];
int main()
{
    int n,m,a,b,c,i,j;
    char s[3];
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        scanf("%d",&m);
        for(i=0;i<m;i++)
        {
            scanf("%d%d%s%d",&a,&b,s,&c);
            if(s[0]=='l')
            {
                q[i].st=a;
                q[i].en=a+b+1;
                k[i]=c-1;
            }
            else
            {
                q[i].st=a+b+1;
                q[i].en=a;
                k[i]=-c-1;
            }
        }
        clr(dis);
        for(i=1;i<=n;i++)
            for(j=0;j<m;j++)
                if(dis[q[j].en]>dis[q[j].st]+k[j])
                    dis[q[j].en]=dis[q[j].st]+k[j];
        for(i=0;i<m;i++)
            if(dis[q[i].en]>dis[q[i].st]+k[i])
                break;
        if(i!=m)
             printf("successful conspiracy\n");
        else printf("lamentable kingdom\n");
    }
    return 0;
}

 

posted @ 2012-08-14 10:26  'wind  阅读(215)  评论(0编辑  收藏  举报