您的位置:首页 > 其它

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

2016-03-31 15:45 183 查看
怎么搞?

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: