乙個典型的01分數規劃, 建圖詳見amber的** 很詳細了
這種題最有可能出問題的是二分精度。尤其是之前做過的乙個密度子圖的題。
所以我一般都二分完畢後再用low作為引數跑一遍
#include #include #include #include #include #include #include #include #include #define eps 1e-5
#define maxn 222
#define maxm 5555
#define inf 100000007
using namespace std;
typedef double type;
struct node
edge[maxm];
int dist[maxn], nm[maxn], src, des, n;
int head[maxn], e;
void add(int x, int y, type c)
void rev_bfs()
q[t++] = des;
dist[des] = 0;
nm[0] = 1;
while(h != t)
}}void init()
type maxflow()
total += tf;
u = src;
}int i;
for(i = cur[u]; i != -1; i = edge[i].next)
if(edge[i].c > 0 && dist[u] == dist[edge[i].v] + 1)break;
if(i != -1) // find an admissible arc, then advance
else // no admissible arc, then relabel this vtex
}return total;
}int nt, m;
int xx[maxm], yy[maxm], vis[maxn], out[maxm];
type cc[maxm];
bool ok(double mid)
flow += maxflow();
if(flow < eps) return true;
else return false;
}void dfs(int u)
int main()
while(high - low > eps)
ok(low);
memset(vis, 0, sizeof(vis));
dfs(src);
int cnt = 0;
for(int i = 1; i <= m; i++)
if(vis[xx[i]] + vis[yy[i]] == 1 || cc[i] <= low)
out[cnt++] = i;
printf("%d\n", cnt);
for(int i = 0; i < cnt; i++)
}return 0;
}
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...