01分數規劃三型別總結

2021-07-26 03:42:51 字數 1512 閱讀 7040

一、生成樹型

給定乙個帶權無向圖,每條邊有兩個權值a[i],b[i],求圖的乙個生成樹,使得sigam(a[i])/sigam(b[i])最小.

解析:我們假設已經找到了乙個解k,乙個新的解比k更優

那麼sigam(a[i])/sigam(b[i])<=k

即sigam(a[i])-k*sigam(b[i])<=0

sigam(a[i]-k*b[i])<=0

然後我們只需要求不等式左邊的sigam(a[i]-b[i])的最小值ans,比較ans和0的關係就能判斷當前解是否最優。

那麼我們演算法的流程就是這樣了:

(1)二分乙個k

(2)用新的邊權a[i]-k*b[i]建圖

(3)求最小生成樹

(4)判斷當前解是否最優

例:【jzyzoj1636】老司機飆車

現在有n個群需要張鍈傑老司機的資源,為了方便表示,我們用1到n這n個數字來表示這n個群。張鍈傑現在在群1,而由於網警的原因,在每個群之間傳輸資源都有特定的需要耗費的時間和所承擔的危險,而且同一時間內資源只能在兩個群之間傳遞。為了凸顯程式設計師的逼格,我們將每個群在乙個三維空間內以座標的形式表示,定義兩個群之間傳輸資源所需時間為這兩個群在xoy平面內投影的直線距離,而危險則被定義為兩個群第三維座標之差。張鍈傑想要單位時間內的平均危險最小,也就是傳輸總時間與承擔的總危險的比值最低,請你幫老司機找出這個比值

#include#include#include#include#include#include#include#includeusing namespace std;

#define eps 0.0005

#define file "read"

#define maxn 1010

#define up(i,j,n) for(int i=j;i<=n;i++)

#define dn(i,j,n) for(int i=j;i>=n;i--)

namespace init

inline int read()

while(isdigit(ch))

return x*f;

}}using namespace init;

struct node

inline int read()

while(isdigit(ch))

return x*f;

}}using namespace init;

struct nodee[maxm*4];

int n,m,len,top,link[maxn],q[maxn],level[maxn],x[maxn],y[maxn],v[maxn],stack[maxn],col[maxn],vis[maxn];\

bool comp(double a,double b)

double maxflow(int x,double flow){

if(x==n) return flow;

double maxflow=0,d=0;

for(int i=link[x];i&&maxflow

0 1分數規劃

題目鏈結 中文鏈結 附一篇大佬部落格感覺講的不錯 0 1分數規劃,不妨設 l a i b i 題目要求要讓結果最大,那麼就是l最大最終移相化簡可得 a i l b i 0,因為a 和b都是已知所以我們可以直接列舉l,當我們所求的值大於零說明l還有更優解當小於零時l沒有最優解。直接二分即可 inclu...

01分數規劃

01分數規劃,就是這樣乙個東西 max frac 其中 xi in 簡而言之,就是在n個物品中選出任意幾個 或者可以有限制選多少個 使得其兩種權值a,b的比值最大 這樣的問題可以二分解決 假如有這樣一道裸題 poj2976,選n k個物品使得比值最大 我們二分出r,若存在 frac r 則r可行 變...

01分數規劃

已經接觸過01分數規劃但是只知道二分寫法 實際求解略慢 dinkelbach演算法還是值得一學的。上一道裸的01分數規劃吧。poj x陣列代表我們選或者不選 0,1構成 r sigma a i x i sigma b i x i 變形 設f v 為 sigma a i x i sigma b i x...