您的位置:首页 > 其它

差分约束<基础题练习><我是图论渣TAT>

2016-05-29 23:17 190 查看
今天有位神犇问我差分约束那道题怎么做QAQ

然而我这么弱怎么可能会那道题QAQ

所以先来介绍下什么是差分约束:

最短路:

dis[v] <= dis[x] + w(x,v);

那么我们考虑:

如果有一些约束,形如:

b−a<=k1

c−b<=k2

c−a<=k3

求c - a的最大值.

那么怎么做呢?

考虑max{c - a}肯定恰好等于某一个约束。

证明:

若有m个约束,其中最大解maxn<所有等式。

那么必然存在更大的解使得其解更优。

上面的都是我在胡言乱语

我们的max{c - a}肯定等于最小的那个约束没错吧。

如果我们考虑把上面的a,b,c分别建立点的话。

我们对a - > b连边,长度为k1。这样disb−disa<=k1

然后我们对其它点都进行连边,最后连成这个样子。



例子引自void - man的博客

那么我们求max{c - a},也就是转化成了求a到c的最短路长度。

这样的话问题就解决了。

于是我打开了百度百科:

其实百度百科的例题还不错:

有n个盒子,每个盒子最多放一个球,现在m个区间[ai,bi]只能放ci个球,求最多在这n个盒子里面放几个球。

对其求前缀和,则有:

Si−Si−1<=1

Sbi−Sai<=ci

这样我们对S0...Sn分别建出点来,跑一下SPFA,然后就能解决辣。

另外,建议一开始跑SPFA的时候增加附加源点,不然很容易挂。

以后应该去练习这些题了QAQ

感觉图论一点都不会……

其实fsf说得好像很有道理……

就是我根本不会图论数学和字符串。

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