ZOJ 2676 01分數規劃 最小割

2021-09-30 14:48:14 字數 1558 閱讀 4790

乙個典型的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...