原始對偶費用流ver2 0 hdu4744

2021-06-18 10:01:43 字數 1463 閱讀 7625

這場比賽我就不多說什麼了。。。幾乎整場都在寫計算幾何,恰好三維計算幾何又是我的軟肋,後面的題基本都沒看。。。

建圖就不多說了,挺水的,標算不是費用流,但我聽說有人zkw費用流過了,於是我就寫個原始對偶費用流,但是居然超了,本機測試60組極限1050+ms==。。。於是進行優化,lyp跟我說過一次反向spfa就可以dij下去了,但是自己推了一下,有乙個對原圖的邊修改的過程.

考慮i->j,w[i][j]>0,操作應該是w[i][j]-=d[i]-d[j],因為d[i]-d[j]<=w[i][j],所以w[i][j]-(d[i]-d[j])>=0,但是考慮反邊w[j][i]-=d[j]-d[i],也就是-w[i][j]+d[i]-d[j],因為d[i]-d[j]<=w[i][j],所以這個反邊貌似還是負的,因此修改過一次後不是所想的全為正權邊,從而不能dij,lyp以前看到的那篇**找不到了,所以也沒法繼續**下去,我自己也不是很理解這個演算法的理論基礎- -,於是另闢蹊徑,用了春瀟最喜歡的優先佇列+spfa,瞬間600+ms過了...

原始對偶費用流對於點度比較大的圖貌似確實有些慢...

#include #include #include #include #include #include #include #define sqr(x) ((x)*(x))

const int oo=1073741819;

using namespace std;

int tail[250],d[250],v[250],flag[250],x[250],y[250],z[250],w[250],b[1050],p[250];

int next[150000],sora[150000],flow[150000],cost[150000],st[150000],po[150000];

int n,ss,s,t,phi,ans,sum,w_time,e,m1;

void change(int x,int w)

bool spfa(int s,int t)

return 1;

}int dfs(int x,int low)

int sum=0,tmp,ne;

flag[x]=w_time;

for (int i=x;next[i];)

bool spfa(int s,int t)

{ int ne,na;

for (int i=0;i<=t;i++) d[i]=p[i]=oo;

p[t]=0;

change(t,p[t]);

for (;d[b[1]]!=oo;) {

ne=b[1];

change(ne,oo);

for (int i=ne;next[i];) {

i=next[i],na=sora[i];

if (flow[po[i]] && p[ne]+cost[po[i]]+p[ne]=oo) return 0;

for (int i=1;i<=t;i++)

if (p[i]

原始對偶費用流

用 dijkstra 代替 spfa link,但是這篇部落格的 上來就跑 dijkstra 複雜度可能會被卡成指數。text interval graph text 滿足題意的充要條件 每個點至多被兩個區間覆蓋。i rightarrow i 1 連一條流量為 2 費用為 0 的邊。l righta...

學習筆記 最小費用流之原始對偶

兼具zkw和spfa的優點,折中的一種演算法,通過spfa跑出最短路,然後更改邊的權值 加上dis from dis to 那麼如果為0就是在from到to最短路上的點,相當於一種分層 個人理解 就可以用多路增廣來搞了。而這裡的spfa除了第一次外甚至可以拿dij來替換,不過因為加了slf優化的sp...

Primal Dual 原始對偶

不是費用流都需要用 spfa 嗎。眾所周知,spfa 去世了,然後網路流顯然有負邊。於是我們可以像 johnson 全源最短路一樣,給邊加上勢能,具體實現看我之前的 部落格 啦。然後對於每一次跑 dijkstra 然後得到最短路,把勢能要再加上這個最短路,可以證明這樣操作一次圖上不會再有負邊。也正因...