最小費用最大流之zkw
zkwzk
w演算法。
主要思想:是模擬kmkm
km演算法,雖然我不是很了解kmkm
km,通過不斷修改可行標號,擴大可行子圖,同時多路增廣,避免了spf
aspfa
spfa
維護較為複雜的標號的佇列操作。
實現的流程:
1.找增廣路與din
ic
dinic
dini
c一樣。
2.找不到增廣路時,進行修改可行標號,通過對費用進行修改,使得產生可行增廣路徑。
時間複雜度與spf
aspfa
spfa
幾乎相同,但是在某些圖常數更小。
適用範圍:較為稠密的圖,二分圖,最終流量較大,費用取值範圍較小,增廣路徑較短的圖。
例題
#include
using
namespace std;
typedef
long
long ll;
const
int n=
405,m=
3e4+
5,inf=
0x3f3f3f3f
,mod=
1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define pii pair
#define fi first
#define se second
#define pb push_back
struct edgee[m]
;int h[n]
,cur[n]
,n,m,mc,mf,st,ed,cost,cnt=1;
bool vis[n]
;void
add(
int u,
int v,
int f,
int w)
,h[u]
=cnt;
}void
add(
int u,
int v,
int f,
int w)
template
<
class
t>
t min
(t &a,t &b)
intaug
(int u,
int flow)
vis[u]
=true
;int rest=flow;
//當前剩餘未用的流量.
for(
int&i=cur[u]
;i;i=e[i]
.nt)
}//printf("flow=%d,rest=%d\n",flow,rest);
return flow-rest;
}bool
modlabel()
void
zkw(
)int
main()
zkw();
printf
("%d %d\n"
,mf,mc)
;return0;
}
學習部落格 最小費用最大流
網 絡流的基本問題為 設乙個有向賦權圖g v,e v 其中有兩個特殊的節點s和s s稱為發點,s 稱為收點。圖中各 邊的方向和權數表示允許的流向和最大可能的流量 容量 問在這個網路圖中從發點流出到收點匯集,最大可通過的實際流量為多少?流向的分布情況為怎樣?設有乙個網路圖g v,e v e中的每條邊 ...
最小費用最大流
const int maxn 250 const int maxm 62272 const int inf 0x4ffffff int n,m struct edge edge maxm int head maxn cnt void init void addedge int u,int v,int...
最小費用最大流
看了最小費用最大流的問題,感覺好難啊,想不到,關鍵就是想不到,知道模板什麼用,只是能a題僅此而已,要想學深真的不是件容易的事情啊。為此我總結了以下幾點供複習知識點或者是講課時用 網路流的費用 在實際應用中,與網路流有關的問題,不僅涉及流量,而且還有費用的因素。網路的每一條邊 v,w 除了給定容量ca...