题意
给出一个带权的连通无向图,对于其中的每条边i,在原来边权的基础上,其边权每增加1需要付出的代价为Ai,边权每减少1需要付出的代价为Bi,现在指定该图的一棵生成树,求通过修改边权,使得该生成树成为图的一棵最小生成树,需要付出的最少总代价。
1<=N<=300, 1<=M, Wi, Ai, Bi<=1000。
分析
这题跟shoi的某题很类似,只不过那题修改的代价均为1,这样的话就可以用km算法来搞。
这题的话,还是一样的建图,把边看成点,然后搞出若干个限制,就变成了线性规划的模型。只不过这个模型的限制都是 >= ,目标函数要取的是最小值,于是我们可以用对偶原理来转化一下,具体来说就是:
然后就可以直接上单纯形了。
一次AC是很资辞的。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=305;
const int M=1005;
const double eps=