題目大意:
給你一堆三維的點,每個點之間的距離是xy軸的歐式距離,代價是高度,問一顆最優比例生成樹。這題是我很早之前做過的了,當初還非常非常菜,給大家看一下我的情況。
當初可真是年少無知啊,這個prim因為是稠密圖,所以n方才能求生成樹,很神奇啊,稠密圖的最小生成樹演算法居然是o(e)的,不過還是很慢就是了。
後來這個題還有一次二分優化,就是說你二分得到的知識不僅僅是只有能或者不能,而是還存在著其他的資訊。
你二分了一次之後還能得到一些有用的,就是你能拿到下一次可能的答案。
你從下一次的答案還能繼續遞推,這樣可以更快速的跳過去。
具體的可以去學學01規劃,這個trick感覺還可以。
ac**(快的那個):
#include #include#include
#include
#include
#include
#include
#define clr(a) memset(a,0,sizeof a)
using
namespace
std;
typedef pair
p;const
int maxn=1000+10
;const
int inf=0x3f3f3f3f
;double
mm[maxn][maxn];
intn,heigh[maxn];
p m_t[maxn];
struct
node
;double dis(double a,double b,double c,double
d)bool
used[maxn];
double j(double
c) lowcast[
0].wei=0
; lowcast[
0].dis=0
; lowcast[
0].cos=0
;
double dis_sum=0,cost_sum=0
;
while(1
)
}if(k==-1
)
break
; used[k]=1
; cost_sum+=lowcast[k].cos;
dis_sum+=lowcast[k].dis;
for(int i=0;i)
if(!used[i]&&lowcast[i].wei>abs(heigh[k]-heigh[i])-c*mm[k][i])
}return cost_sum/dis_sum;
}int
main()
double rate=0
,t_rate;
while(1
)
rate=t_rate;
}printf(
"%.3lf\n
",rate);}}
poj 2728(最優比率生成樹 二分)
題目大意是 給你座標上一些點,然後你需要用一些邊把他們連線起來,邊有費用和長度,求總費用和總長度最小比值。二分答案 每邊有兩權值 a,b 求 a b最小的生成樹.設 a b k a k b a1 a2 an k b1 b2 bn ai k bi 0 即邊權變為a k b後求mst,看是否 0,如果 ...
POJ 2728 最優比例生成樹
有帶權圖g,對於圖中每條邊e i 都有benifit i 收入 和cost i 花費 我們要求的是一棵生成樹t,它使得 benifit i cost i i t 最大 或最小 設x i 等於1或0,表示邊e i 是否屬於生成樹.則我們所求的比率 r benifit i x i cost i x i ...
poj2728 最優比率生成樹
這個題的意思是給你乙個連通圖,圖上每個點都有連個權值ai,bi讓你選乙個生成樹使得sigma ai xi sigma bi xi 最小,對比與基礎的01規劃,我們假設答案是mid,然後建立乙個圖,其新的邊的權值是ai mid bi,然後求解最小生成樹,假設其答案是tp,如果tp 0,說明還有更優的解...