差分约束系统

 

 

参考:http://hi.baidu.com/fallingflowers/blog/item/c8068c6fbcaddddc80cb4a20.html

 

纠结了我几天,终于搞通了。因为Poj 1364 而开始研究的差分约束系统。

描述:n个未知数x1...xn;m个约束条件形如:xj - xi <= k; 求能满足所有约束条件的未知数的解。

与图的联系:咋一看,实在是看不出来该问题和图有什么联系。其实可以发现约束条件这个不等式和图的单源最短路径算法中的松弛操作极为类似,这样,上述问题可以转换成n个结点m条边的有向图(图不一定连通),其中n个结点分别为n个未知数,m条有向边分别代表m个约束条件,对于条件 xj - xi <= k; 对应着弧<xi,xj>的权值为k(测试了一下xi xj的位置应该可以颠倒).通过求解新建立图的单源最短路经问题就能得到差分约束系统的一组解。

另外,为保证图的连通,在图中引入附加节点vs使图中每个顶点vi都能从vs可达,并设弧<vs,vi>的权w<vs,vi>=0;(实际上边权可以设为任意的小于INF的值,因为增加vs的目的是保证图的连通性);下面就可以用单源最短路径算法 Bellman-Ford 或者 SPFA算法来求解以vs为源点的最短路。

若图中存在负权回路,则该差分约束系统不存在可行解。(由于附加源点vs是有向边,所以不会给图带来负权回路)

通过这篇博客(http://www.cnblogs.com/ylfdrib/archive/2010/07/20/1781158.html)又学习到:

1.用Bellman-Ford算法时,可以不加入源点vs,因为Bellman-Ford算法本身就是对边来进行操作的,即使图不连通,也能对每条边进行松弛,也能判断图中是否有负权回路。

2.但SPFA算法就不同了,是对点操作,通过点,对与之相连的边进行松弛,所以必须附加一个源点vs使图连通,才能对每条边松弛。不过还是有种方法可以不加vs,就是将所有点先入队。

求解差约束分系统,关键在于找到约束条件,然后用Bellman-Ford,或SPFA就能做了。

 

相关题目:

poj1364

poj3159

poj2983

poj3169

poj1201

poj1716

poj1275

 

你可能感兴趣的:(c,算法,测试,2010)