ACM網路流模板(更新ing )

2021-08-21 15:38:25 字數 2446 閱讀 1727

1、 最大流

2、二分圖匹配

3、最小費用流

1、最大流( ff、ek、dinic演算法比較)

2、最大流(dinic演算法)

描述:dinic演算法總是尋找最短的增廣路,並沿著它增廣。與之相對,ek演算法執行完一次bfs增廣後,要重新從源點s開始尋找另一條增廣路,而在dinic演算法中,只需一次bfs就可以實現多次增廣,效率提高。

複雜度:o(v^2·e)

int v,e;

struct edge

};vectorg[max_v];

int level[max_v]; //頂點到源點的距離標號

int iter[max_v]; //當前弧,之前的邊已經用過了

void add_edge(int from,int to,int cap)

//通過bfs構造層次圖

void bfs(int s)

}}}

//在層次圖上通過dfs不斷尋找增廣路

int dfs(int u,int t,int f)}}

return -1;}

int max_flow(int s,int t)

}}

3、二分圖匹配(匈牙利演算法)

描述:思想為尋找增廣路,在二分圖匹配中,如果一條路徑首尾是非匹配點,路徑中除此之外都是匹配點,那麼這條路徑就是一條增廣路。

int v; //二分圖左側頂點數

vectorg[max_v];

int match[max_v]; //記錄妹子的男盆友

int used[max_v];

void add_edge(int u,int v)

bool dfs(int u)

}; int dist[max_v];

bool used[max_v];

int prv[max_v],pre[max_v]; //最短路的前驅節點和對應的邊

vectorg[max_v];

void add_edge(int from,int to,int cap,int cost)

ll min_cost_flow(int s,int t,int f)}}

}if(dist[t]==inf)//找不到增廣路了

return -1;

//沿s到t的最短路盡量增廣

int d=f;

for(int v=t;v!=s;v=prv[v])

f-=d;

ans+=d*dist[t];

for(int v=t;v!=s;v=prv[v])

}return ans;

}

5、最小費用流(dijkstra演算法求解)

描述:在殘餘網路上總是沿著最短(費用)路增廣。引入勢h(v),取h(v)=s到v的最短距離,將邊e=(u,v)的長度變為d』(e)=d(e)+h(u)-h(v),使得對所有的e都有d』(e)>=0,就可用dijkstra演算法求解在d』中求解最短路。

複雜度:o(f|e|log|v|)

struct edge

}; int v;

int h[max_v]; //頂點的勢

int dist[max_v]; //考慮勢之後的最短距離

int prv[max_v],pre[max_v]; //最短路的前驅節點和對應的邊

vectorg[max_v];

void add_edge(int from,int to,int cap,int cost)

ll min_cost_flow(int s,int t,int f)}}

if(dist[t]==inf) //找不到增廣路了

return -1;

for(int v=0;v<=t;v++)h[v]+=dist[v]; //更新h[v]

//沿s到t的最短路盡量增廣

int d=f;

for(int v=t;v!=s;v=prv[v])

d=min(d,g[prv[v]][pre[v]].cap);

f-=d;

ans+=d*h[t];

for(int v=t;v!=s;v=prv[v])

}return ans;

}

66666666666666666666666666

66666666666666666666666666

ACM動態規劃模板(更新ing )

1 最長上公升子串行問題 題目 有乙個長為n的數列a0,a1,an 1。請求出這個序列中最長的上公升子串行的長度。上公升子串行指的是對於任意的 i j 都滿足ai aj 的子串行。思路 定義dp i 為長度為i 1的上公升子串行中末尾元素的最小值 不存在的話為inf 最長上公升子串行問題 int d...

網路流模板

鄰接矩陣 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...