下面的不是很清楚 ,这个 比较好。
简介:
详情 前参见 国家集训队论文 2007年 胡伯涛 论文
题意:求存在一个环路,所有的点权之和/所以的边权之和 最大是多少?
http://poj.org/problem?id=3621
算法:此题是对01分数规划的应用,那么首先明白01分数规划的思想.
01分数规划的思想的描述如下:令c=(c1,c2,…,cn)和d=(d1,d2,…,dn)为n维整数向量,那么一个0-1分数规划问题用公式描述如下:FP: 最小化(c1x1+…cnxn)/(d1x1…dnxn)=cx/dx xi∈{0,1}这里x表示列向量(x1,x2,…,xn)T .0-1值向量的子集Ω称作可行域,而x则是Ω的一个元素,我们称x为可行解。即可以简化为y=c/d.那么再演变一下:y-c/d=0.我们目标是求y.那么我们可以假设函数f(y)=y-c/d.
重要结论:
对于分数规划问题,有许多算法都能利用下面的线性目标函数解决问题。
Q(L): 最小化 cx-Ldx xi∈{0,1}
记z(L)为Q(L)的最值。令x*为分数规划的最优解,并且令L*=(cx*)/(dx*)(注:分数规划的最值)。那么下面就容易知道了:
z(L) > 0 当且仅当 L<L*
z(L) = 0 当且仅当 L=L*
z(L) < 0 当且仅当 L>L*
此外,Q(L*)的最优解也能使分数规划最优化。因此,解决分数规划问题在本质上等同于寻找L=L*使z(L)=0
因此,求解f(y)=0,为其函数的最优解,即可以利用二分的思想逐步推演y,从而求得最优解.
回到题目,我们知道是求解segma(f[V])/segma(E[v])的最大值,同时每个结点对应一个点权,每条边对应一个边权,那么我们就可以联想到应用01分数规划的思想来求解.而01分数规划是与二分紧紧联系在一起的.那么怎么应用二分求解呢?
我们首先想想当仅仅有2个结点环路的时候,问题就演变为f(y)=y-c/d,而y是通过二分逐步推算出来的,那么我们的任务就变为在一定的精度范围内测试求解其最优解.当y-c/d>0时,y减少; y-c/d<0时,y增大.在2个结点之间,那么我们就可用重新将图的权变为y-c/d,这样问题就回到2个结点的环路是否存在负权回路,存在说明y-c/d<0,不存在y-c/d>0.从而进一步推算最优解y。
/*
01整数规划问题 ,
01整数规划问题 分为两类
最大化 ,最小化 以最小化 如 求 最小值 l=ax/bx ,(ax bx是一些数的和),变形为 ax-l*bx=0,我们令 f(x)=min(ax-l*bx),我们要求的是这样的一个 l 对于 给定的 l
首先 ax1-l*bx1=0
不存在 x 使得 (因为 l 是我们求的 最小值)
ax-l*bx > 0
这样的话 ax>l*bx ;
关键是我们如何求这个l 呢? 有上面的 我们可以得到,用 二分法,求 l ,
对于 f(x)=min(ax-l*bx)
对于给定的 l
若 f(x)<0 则说明 l 偏大
若 f(x)>0 说明 l 偏小
对于 图上的 01 整数规划 我门只需要将 边权变为 ax-l*bx 或者 l*bx- ax;
例如 对于 最优比率树 : 大意:给定一张图,每条边有一个收益值和一个花费值,求一个生成树,要求花费/收益最小,输出这个值
我们只需要将 边权 变为 a1-l*b1 然后 求最小生成树 就行 判断 求和的 ai-l*bi 的值 于0 的大小
*/
poj 2976 Dropping tests 【最优比例点】
View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
【例题2Poj2728Desert King——最优比率生成树】
View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include
【例题3Poj3621Sightseeing Cows——最优比率环】
spfa (判负环)
View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include