鉴于spfa基础上的差分约束算法

来源:互联网 发布:os x 下载软件 编辑:程序博客网 时间:2024/04/29 12:45

怎么搞?
   
   1. 如果要求最大值
     想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意x-y<k =>x-y<=k-1
    将这些约束条件转化为差分约束,不妨设T[x] = S[1]+S[2]+....S[x],那么上面式子就可以转化为:
        1. T[si+ni] - T[si-1] > ki          2. T[si+ni] - T[si-1] < ki 
        又差分约束系统的求解只能针对>=或<=,无法求解>的系统,还好ki是整数,可以很容易将<转化为<= 
       1. T[si-1] - T[si+ni] <= -ki - 1    2. T[si+ni] - T[si-1] <= ki - 1 

      如果要求最小值
     的话,变为x-y>=k的标准形式,然后建立一条从y到x的k边,求出最长路径即可,ralex;

   2.如果权值为正,用dijk,spfa,bellman都可以,如果为负不能用dijk,并且需要判断是否有负环,有的话就不存在

   1.怎么建图;(为什么这么建图)
   2.为什么求的是最长路,为什么是最短路。
   3.为什么可以这么做,别的方法还有的。
   

   spfa去松弛的意思是什么?
   1.找最长或者最短,或者
      判断负环
   2.也就是   例如:poj1364KING题(判断负环,表示满足);
   注:在SPFA开始时将所有结点都放进队列,这样表示一开始和所有点都相连了,初始化dis数组为全0,相当于超级源点的边权值;
   
 /*********------BIG PROBLEM*******-------//////-----

   差分约束的dis[i]代表什么;
    距离;
    什么距离.
   所以说...

 /*********------BIG PROBLEM*******-------//////-----

    这里有个技巧就是使用spfa不想添加附加的节点Vs的话,可以在初始化把所有的节点都加到队列中去,其实就相当于源点入队,开始算法后Vs出队
   更新所得的队列,因为没有边指向Vs,所以后面的更新不会涉及到Vs,即在后面的计算中都不会用到Vs。

 /*******--------建图///初始化--------**************////////***---

 【超级源点】
  spfa的性质决定,因为牛逼的spfa会先从一个点去引开它所连接的点。。。所以炒鸡源点就是非常炒鸡!!非常牛逼,连接了n个点

 由于P  A  B  X 指“确定A到B的距离(边权)为X”
 从P  A  B  X得到的差分系统为
 dist[A] - dist[B] >= X  &&  dist[A] - dist[B] <= X
 等价于
 dist[B] <= dist[A] - X  &&  dist[A] <= dist[B] + X
  则if(dist[B] > dist[A]-X) 松弛:dist[B] = dist[A]-X
 由于 V  A  B指“只知道A到B的距离(边权)至少为1”
 从V  A  B得到的差分系统为
 dist[A] >= dist[B] +1
 等价于
 dist[B] <= dist[A] -1
 则if(dist[B] > dist[A] -1)  松弛:dist[B] = dist[A] -1





0 0