網路流演算法模板

2021-08-25 11:29:08 字數 1694 閱讀 2620

引用於一些大佬的文章

dinic演算法:(第二個模板為白書的寫法)

poj1273為例

題意:m條路徑,n個點,每條路徑輸入起點,終點和流量,求源點到匯點的最大流量

#include #include #include #include #define inf 9999999

using namespace std;

int n,m;

int c[205][205],dis[205]; //c陣列為原始網路

int bfs()}}

if(dis[n]>0) return true; //匯點值不為-1,說明增廣路徑存在

return false; //反之不存在

}int dfs(int point,int max) //point為當前遍歷的節點,max為最大可行流量,max初始為inf

}return 0;}

int main()

int sum=0;

while(bfs()) //當增廣路徑存在進行dfs

coutint level[400];//頂點到源點的距離標號

int iter[400];//當前弧,在其之前的邊就已經沒有用了

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

); g[to].push_back((edge));

}//通過bfs計算從源點出發的距離的標號

void bfs(int s)}}

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

return 0;

}int dinic(int s,int t)

}return flow;

}

ford-flukson演算法:

poj 3281為例

#include #include #include #include #include #include //#include #define maxn 402

#define inf 0x3f3f3f3f

using namespace std;

bool likefood[110][110];

bool likedrink[110][110];

int n,f,d;

struct edge ;

vector g[maxn];

bool used[maxn];

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

); g[to].push_back((edge));

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

return 0;

}int max_flow(int s,int t)

}int main()}}

if(pre[des]==-1) //殘留圖中不再存在增廣路徑

return -1;

else

return flow[des];

}int maxflow(int src,int des)

sumflow += increasement;

}return sumflow;

}int main()

cout<}

return 0;

}

網路流演算法模板

1 基於ford fulkerson方法的edmonds karp演算法 用廣度有限搜尋來實現對增廣路徑p 的計算。即,如果增廣路徑是殘留網路種從s 到t 的最短路徑,則能夠改進ford fulkerson的界。view code 1 做一次增廣路徑的流量統計23 int augment else ...

網路流基礎演算法模板

網路流是一種非常玄妙的演算法,被廣泛地用於各種有權值存在或一對多的匹配問題中。而網路流又有許多數學性質,比如最大流等於最小割等等。本篇主要介紹常用的dinic最大流演算法。網路,就是一張有點有邊圖。其中有兩個特殊的點 源點和匯點。網路流中的每一條邊就好比一條水管,容量就好比是這個水管的粗細。我們要求...

網路流EdmondsKarp演算法模板理解

先推薦乙個講網路流的部落格,我的網路流知識均吸收於此 傳送門 edmondskarp演算法基本思想 從起點到終點進行bfs,只要存在路,說明存在增廣路徑,則取這部分路 權值最小的一部分,即為增廣路徑 也就是這一部分路的最大流量 然後將這條路上的正向權值都減去min,反向權值都加上min 即,m i ...