差分约束

学习链接:
http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html
http://972169909-qq-com.iteye.com/blog/1185527

摘录:(引用)
第一:
感觉难点在于建图
第二:
①:对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值
②:对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值
③:存在负环的话是无解
④:求不出最短路(dist[ ]没有得到更新)的话是任意解
第三:
一种建图方法:
设x[i]是第i位置(或时刻)的值(跟所求值的属性一样),那么把x[i]看成数列,前n项和为s[n],则x[i] = s[i] - s[i-1];
那么这样就可以最起码建立起类似这样的一个关系:0 <= s[i] - s[i-1] <= 1;
其他关系就要去题目探索了


学习了一个spfa模板:

bool SPFA(int source)
{
  int u,v,w,i;
  memset(vis,0,sizeof(vis));
  memset(inq,0,sizeof(inq));
  for (i=0;i<=n;i++) dis[i]=-INF;
    dis[source]=0;
    inq[source]=1;
    vis[source]=1;
  queue<int>q;
  points now;
  q.push(source);
  while (!q.empty())
  {
    u=q.front(); q.pop();
    inq[u]=0;
    for (i=0;i<G[u].size();i++)
    {
      v=G[u][i].u;
      w=G[u][i].c;
      if (dis[v]<dis[u]+w)
      {
        dis[v]=dis[u]+w;
        if (!inq[v])
        {
          inq[v]=1;
          q.push(v);
          if (++vis[v]>n) return false;
        }
      }
    }
  }
  return true;
}

套模板注意事项:
判断负环的n代表点数
清dis的时候要注意范围,要记得修改(因为直接套了模板wa了12次。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值