有帶權圖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]), 0≤i
為了使 r 最大, 設計乙個子問題---> 讓 z = ∑(benifit[i] * x[i]) - l * ∑(cost[i] * x[i]) = ∑(d[i] * x[i]) 最大 (d[i] = benifit[i] - l * cost[i]) , 並記為z(l).
然後明確兩個性質:
1. z單調遞減
證明: 因為cost為正數, 所以z隨l的減小而增大.
2. z( max(r) ) = 0
證明: 若z( max(r) ) < 0, ∑(benifit[i] * x[i]) - max(r) * ∑(cost[i] * x[i]) < 0, 可化為 max(r) < max(r). 矛盾;
若z( max(r) ) >= 0, 根據性質1, 當z = 0 時r最大.
/*id: [email protected]
prog:
lang: c++
*/#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 1010
#define inf (1<<30)
#define pi acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define for(i, n) for (int i = 0; i < n; i++)
#define eps (1e-5)
typedef long long ll;
//二分法 複雜度較高
using namespace std;
int n, vis[maxn], pre[maxn];
struct node p[maxn];
double edge[maxn][maxn];
void init()
for (int i = 1; i <= n; i++)
}double dis[maxn];
double prim(double l)
vis[1] = 1;
double cost = 0;
for (int i = 1; i < n; i++)
if (k != -1) }}
}return cost;
}void binary()
printf("%.3f\n", mid);
}int main ()
return 0;
}//迭代法
using namespace std;
int n, vis[maxn], pre[maxn];
struct node p[maxn];
double edge[maxn][maxn];
void init()
for (int i = 1; i <= n; i++)
}double dis[maxn];
double prim(double l)
vis[1] = 1;
double cost = 0, len = 0;
for (int i = 1; i < n; i++)
if (k != -1) }}
}return cost / len;
}void iter()
printf("%.3f\n", b);
}int main ()
return 0;
}
POJ 2728 最小比例生成樹
傳送門 有n個村莊,每個村莊都有乙個 x,y 座標和z海拔,定義兩個村莊間的dist為座標的距離,cost為海拔差的絕對值,求圖的一顆生成樹,使得 frac 最小。最小比例生成樹的裸題。看到 frac 的分數形式,首先可以想到分數規劃 設 ans frac 則 sum cost ans sum di...
poj2728 最優比率生成樹
這個題的意思是給你乙個連通圖,圖上每個點都有連個權值ai,bi讓你選乙個生成樹使得sigma ai xi sigma bi xi 最小,對比與基礎的01規劃,我們假設答案是mid,然後建立乙個圖,其新的邊的權值是ai mid bi,然後求解最小生成樹,假設其答案是tp,如果tp 0,說明還有更優的解...
poj 2728 最優比率生成樹
思路 設sum cost i sum dis i r 那麼要使r最小,也就是minsum cost i r dis i 那麼就以cost i r dis i 為邊權重新建邊。當求和使得最小生成樹的 sum cost i r dis i 0時,這個r就是最優的。這個證明是01分數規劃。include ...