poj1364(King)

来源:互联网 发布:java中两个list合并 编辑:程序博客网 时间:2024/05/01 21:20

         题目链接:http://poj.org/problem?id=1364

         题意:给出n个变量,m个约束公式 asi + asi+1 + .... + asi+ni < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。

          分析:asi + asi+1 + ....... + asi + n < ki or > ki,因为ai和ki都为整,设sum[n] 为 变量ai的前n个和,则可以转化为 sum[si+n] - sum[si-1] <= ki -1 or sum[si-1] - sum[si+n] <= -1-ki ,这样问题就转化为差分约束的情况,可以差用Bellman-Ford算法进行求解。

 代码:

#include<stdio.h>#include<string.h>struct Edge{int u;int v;int w;}edge[105];int dis[105];int n,m,p;int si,ni,ki;char oi[3];int Bellman_ford(){int i,j;    memset(dis,0,sizeof(dis));for(i=1;i<=n;i++)//引入源点0之后有n+1个点了,最多松弛n次for(j=0;j<p;j++)           if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)dis[edge[j].v] = dis[edge[j].u]+edge[j].w;   for(i=0;i<p;i++)//如果第n+1还可以松弛,则说明存在负权环,即不存在这样的序列   if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w)   return 1;   return 0;}int main(){int i;while(scanf("%d",&n) && n!=0){p=0;scanf("%d",&m);        for(i=0;i<m;i++){scanf("%d%d%s%d",&si,&ni,oi,&ki);if(oi[0]-'l' == 0){edge[p].u=si-1;edge[p].v=si+ni;edge[p].w=ki-1;p++;}else {                edge[p].u=si+ni;edge[p].v=si-1;edge[p].w=-ki-1;p++;}}if(Bellman_ford())printf("successful conspiracy\n");else printf("lamentable kingdom\n");}return 0;}

原创粉丝点击