日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【模板】EK求最大流、dinic求最大流

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模板】EK求最大流、dinic求最大流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACM模板


目錄

      • 概念
      • EK算法
      • Dinic算法

概念

yxc老師的部分總結

  • 基本概念
    1.1 流網絡,不考慮反向邊
    1.2 可行流,不考慮反向邊
    1.2.1 兩個條件:容量限制、流量守恒
    1.2.2 可行流的流量指從源點流出的流量 - 流入源點的流量
    1.2.3 最大流是指最大可行流
    1.3 殘留網絡,考慮反向邊,殘留網絡的可行流f’ + 原圖的可行流f = 原題的另一個可行流
    1.4 增廣路徑
    1.5 割
    1.5.1 割的定義
    1.5.2 割的容量,不考慮反向邊,“最小割”是指容量最小的割。
    1.5.3 割的流量,考慮反向邊,f(S, T) <= c(S, T)
    1.5.4 對于任意可行流f,任意割[S, T],|f| = f(S, T)
    1.5.5 對于任意可行流f,任意割[S, T],|f| <= c(S, T)
    1.5.6 最大流最小割定理
    (1) 流f是最大流
    (2) 流f的殘留網絡中不存在增廣路
    (3) 存在某個割[S, T],|f| = c(S, T)
    1.6. 算法
    1.6.1 EK O(nm^2)
    1.6.2 Dinic O(n^2m)
    1.7 應用
    1.7.1 二分圖
    (1) 二分圖匹配
    (2) 二分圖多重匹配
    1.7.2 上下界網絡流
    (1) 無源匯上下界可行流
    (2) 有源匯上下界最大流
    (3) 有源匯上下界最小流
    1.7.3 多源匯最大流
  • EK算法

    鏈式前向星初始化-1版本 0正邊 1反邊
    S源點 T匯點
    d[]流量 pre[]前向邊

    存圖存的是殘留網絡
    時間復雜度:O(nm2)O(nm^2)O(nm2)

    constexpr int N=1010,M=20010; int h[N],e[M],ne[M],f[M],idx; int n,m; int S,T,flow[N],pre[N]; bool st[N]; void add(int a,int b,int c) {e[idx]=b,f[idx]=c,ne[idx]=h[a],h[a]=idx++;e[idx]=a,f[idx]=0,ne[idx]=h[b],h[b]=idx++; } bool bfs() {queue<int> q;memset(flow,0x3f,sizeof flow);memset(st,0,sizeof st);q.push(S);st[S]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(f[i]&&!st[v]){st[v]=1;flow[v]=min(flow[u],f[i]);pre[v]=i;if(v==T) return 1;q.push(v);}}}return 0; } int EK() {int ans=0;while(bfs()){ans+=flow[T];for(int i=T;i!=S;i=e[pre[i]^1]){f[pre[i]]-=flow[T];f[pre[i]^1]+=flow[T];}}return ans; }

    Dinic算法

    模擬隊列
    時間復雜度:O(n2m)O(n^2m)O(n2m)

    int h[N],e[M],ne[M],f[M],idx; int S,T,d[N],q[N],cur[N]; void add(int a,int b,int c) {e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;e[idx]=a,ne[idx]=h[b],f[idx]=0,h[b]=idx++; } bool bfs() {memset(d,-1,sizeof d);int hh=0,tt=0;d[S]=0,cur[S]=h[S],q[0]=S;while(hh<=tt){int u=q[hh++];for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(d[v]==-1&&f[i]){d[v]=d[u]+1;cur[v]=h[v];// 當前弧優化if(v==T) return 1;q[++tt]=v;}}}return 0; } int dfs(int u=S,int flow=0x3f3f3f3f) {if(u==T) return flow;int rmn=flow;for(int &i=cur[u];i!=-1&&rmn;i=ne[i]){int v=e[i];if(d[v]==d[u]+1&&f[i]){int t=dfs(v,min(f[i],rmn));if(!t) d[v]=-1;// 優化f[i]-=t,f[i^1]+=t,rmn-=t;}}return flow-rmn; } int dinic() {int r=0;while(bfs()) r+=dfs();return r; }

    總結

    以上是生活随笔為你收集整理的【模板】EK求最大流、dinic求最大流的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。