poj 1364(差分约束-bellmanford)

差分约束:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。
求解差分约束系统,可以转化成图论的 单源最短路径(或最长路径)问题。
观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]<=w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。我们再增加一个源点s,s与所有定点相连,边权均为0。对这个图,以s为源点运行Bellman-ford算法(或SPFA算法),最终{d[ i]}即为一组可行解。
解题思路: 
  1 2 gt 0
         a1+a2+a3>0
          2 2 lt 2
         a2+a3+a4<2

首先设Si=a1+a2+a3+...+ai

那么根据样例可以得出
      S3-S0>0---->S0-S3<=-1
      S4-S1<2---->S4-S1<=1

那么根据差分约束建图,加入这些有向边
      gt:  <a+b,a-1>=-ki-1
      lt:  <a-1,a+b>=ki-1
     再根据bellman_ford判断是否有无负环即可
     若出现负环了则这个序列不满足所有的不等式


源码:

#include <iostream>
#include <memory.h>
using namespace std;
typedef struct
{
    int s,t,w;
}Edge;
Edge edge[110];
int n,m;
bool bellman_ford()
{
    int dist[110];
    memset(dist,0,sizeof(dist));
    for(int i=1;i<=n;i++)
      for(int j=0;j<m;j++)
        if(dist[edge[j].s]+edge[j].w<dist[edge[j].t])
         dist[edge[j].t] = dist[edge[j].s]+edge[j].w;
    for(int j=0;j<m;j++)
    if(dist[edge[j].s]+edge[j].w<dist[edge[j].t])
      return 0;
    return 1;
}
int main()
{
    int a,b,c;
    char s[3];
    while(cin>>n)
    {
        if(!n)
         break;
        cin>>m;
        for(int i=0;i<m;i++)
          {
              cin>>a>>b>>s>>c;
               if(s[0]=='g')
                {
                edge[i].s=b+a;
                edge[i].t=a-1;
                edge[i].w=-c-1;
                }
               else
               {
                edge[i].s=a-1;
                edge[i].t=b+a;
                edge[i].w=c-1;
               }
          }
      if(!bellman_ford())
        cout<<"successful conspiracy"<<endl;
      else
        cout<<"lamentable kingdom"<<endl;
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值