引用於一些大佬的文章
dinic演算法:(第二個模板為白書的寫法)
poj1273為例
題意:m條路徑,n個點,每條路徑輸入起點,終點和流量,求源點到匯點的最大流量
ford-flukson演算法:#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;
}
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 ...