網路流 模板小記

2022-09-19 10:42:08 字數 1637 閱讀 2599

\[這篇blog是為了記錄下網路流的模板

\]\[最大流(maxflow)

\]這個比較常用了 \(problem\)

\(link\)

注意鄰接表的\(tot\)從\(1\)開始

反邊邊權為\(0\)

可用當前弧優化 就是用乙個\(cur\)陣列覆蓋\(head\)

可以看出 在同為手敲棧的前提下 有無弧優化是有一定差別的

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e4+5,m=2e6+5;

int n,m,s,t;

ll ans,head[n],tot=1,cur[n];

struct nodea[m];

int dep[n],q[n],head,tail;

void add(int x,int y,int k)

; head[x]=tot;

}bool bfs()

} }return dep[t];

}ll dinic(int x,ll k)

} if(link==0) dep[x]=0;

return link;

}int main()

while(bfs())

printf("%lld",ans);

return 0;

}

\[最小費用最大流(mincost~maxflow)

\]它沒有死 並且是常用演算法 \(problem~link\)

鄰接表\(tot\)從\(1\)開始

反邊容量為\(0\) 邊權為\(-k\)

初始化\(flow\) 和\(dis\)為\(inf\)

記錄\(to\)點在\(head\)裡的位置 以及\(to\)的父親

每次將\(vis[x]\)清為\(0\)

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=5005;

int n,m,s,t,maxflow,mincost,dep[n],head[n],tot=1;

int vis[n],dis[n],flow[n],fa[n],p[n];

struct nodea[n*20];

void add(int x,int y,int limit,int k)

; head[x]=tot;

a[++tot]=(node);

head[y]=tot;

}bool spfa()

}} vis[x]=0;

} return flow[s]!=flow[t];

}void mcmf() }}

int main()

mcmf();

printf("%d %d",maxflow,mincost);

return 0;

}

至於\(hlpp(\)預流推進\()\)

以及負圈費用流 後面會慢慢\(update\)

網路流模板

鄰接矩陣 include include include using namespace std const int inf 1 30 const int point num 300 int cap point num point num dist point num gap point num 初...

網路流模板

最大流 最小割 演算法 最小割就是刪掉權值最小的邊讓源點和匯點分別分在兩個不連通的集合 就是把圖分成兩個集合,保證源點和匯點不連通,可以解決刪掉權值最小的邊刻意讓某些點和另外點孤立,也就是堵住前面點到匯點的去路 增廣路edmondskarp演算法 n m 2 n是點數,m是有向邊數 define r...

網路流模板

最大流 include include include include include include using namespace std define clr a x memset a x sizeof a const int maxm 1005 const int maxn 20 const...