[01分数规划]【学习笔记】
01分數規劃
$N$個物品選$k$個,最大化:
$\frac{\sum\limits_{i=1}^{k}A_i}{\sum\limits_{i=1}^{k}B_i}$
二分答案$mid$
如果
$\sum\limits_{i=1}^{k}{A_i-mid*B_i}\ >\ 0$
則可以更優
顯然是要選擇$A_i-mid*B_i$的前$k$大
?
最優比率生成樹
最小化生成樹的$n$條邊
$\frac{\sum\limits_{i,j=1}^{n}cost(i,j)}{\sum\limits_{i,j=1}^{n}Dis(i,j)}$
一樣的做法二分答案每次求最小生成樹
然后完全圖用$Kruskal$多一個$log$,還是用$Prim\ Naive$好(你以為我會告訴你我現學的$Prim$嘛)
?
最優比率環
找一個環,最大化某個條件
二分答案,在圖上轉化為負環
$spfa$判斷負環:
$1.$普通$BFS$做法,可以先把所有點加到隊列里,$d[i]=0$
$2.$$DFS$做法,$d[i]=0$,枚舉每個點開始$DFS$,看看會不會形成環
double d[N]; int vis[N],cl; bool dfs(int u,double mid){vis[u]=cl;for(int i=h[u];i;i=e[i].ne){int v=e[i].v;double w=mid*e[i].w-f[u];if(d[v]>d[u]+w){d[v]=d[u]+w;if(vis[v]==vis[u]) return true;else if(dfs(v,mid)) return true;}}vis[u]=0;return false; } bool NegativeCircle(double mid){memset(vis,0,sizeof(vis));for(cl=1;cl<=n;cl++) if(dfs(cl,mid)) return true;return false; } DFS?
最大權密度子圖
$Maximize D=\frac{\sum\limits_{e \in E}x_e}{\sum\limits_{v \in V}x_v}$
$x_e,x_v \in {0,1}$
$\forall e=(u,v) \in E,\ u,v \in V$
同樣二分答案$g$,然后判斷
$\sum\limits_{e \in E}x_e\ -\ \sum\limits_{v \in V}x_v*g\ >\ 0$則可以更優
二分查找范圍$[m,\frac{1}{n}]$,精度$\frac{1}{n^2}$
求解二分查找后式子的最大值使用最大權閉合子圖,選一條邊則必須選擇兩個頂點
$s--1-->e--INF-->u,v--g-->t$
總結
以上是生活随笔為你收集整理的[01分数规划]【学习笔记】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批量修改nginx配置文件
- 下一篇: Scala学习第五天数组