POJ 1273 && HDU 1532 Drainage Ditches (Dinic 算法)
2013-09-07 08:18
351 查看
转载请注明出处:http://blog.csdn.net/a1dark
分析:Dinic模板题、先比EK算法而言、确实要优化一些、Dinic要比EK难理解一些、用一次DFS代替多次BFS、很神奇的算法、Orz。。。
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#include<string.h>
#define N 205
#define INF 0xfffffff
int map
;
int level
;
int m,n;
int bfs(int s,int t){//对顶点进行标号、找出层次图
memset(level,0,sizeof(level));
queue<int > q;
q.push(s);
level[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(!level[i]&&map[now][i]>0){
level[i]=level[now]+1;
q.push(i);
}
}
}
return level
!=0;//汇点是否在层次图中
}
int dfs(int s,int cp){//在层次图中寻找增广路径进行增广
int tmp=cp;
int t;
if(s==n)return cp;
for(int i=1;i<=n&&tmp;i++){
if(level[i]==level[s]+1&&map[s][i]>0){
t=dfs(i,min(tmp,map[s][i]));
map[s][i]-=t;
map[i][s]+=t;
tmp-=t;
}
}
return cp-tmp;
}
int dinic(){
int ans=0,flow=0;
while(bfs(1,n)){//汇点不在层次图中,算法终止
while(flow=dfs(1,INF))
ans+=flow;
}
return ans;
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF){
memset(map,0,sizeof(map));
int s,e,v;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&s,&e,&v);
map[s][e]+=v;
}
printf("%d\n",dinic());
}
return 0;
}
分析:Dinic模板题、先比EK算法而言、确实要优化一些、Dinic要比EK难理解一些、用一次DFS代替多次BFS、很神奇的算法、Orz。。。
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#include<string.h>
#define N 205
#define INF 0xfffffff
int map
;
int level
;
int m,n;
int bfs(int s,int t){//对顶点进行标号、找出层次图
memset(level,0,sizeof(level));
queue<int > q;
q.push(s);
level[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=1;i<=n;i++){
if(!level[i]&&map[now][i]>0){
level[i]=level[now]+1;
q.push(i);
}
}
}
return level
!=0;//汇点是否在层次图中
}
int dfs(int s,int cp){//在层次图中寻找增广路径进行增广
int tmp=cp;
int t;
if(s==n)return cp;
for(int i=1;i<=n&&tmp;i++){
if(level[i]==level[s]+1&&map[s][i]>0){
t=dfs(i,min(tmp,map[s][i]));
map[s][i]-=t;
map[i][s]+=t;
tmp-=t;
}
}
return cp-tmp;
}
int dinic(){
int ans=0,flow=0;
while(bfs(1,n)){//汇点不在层次图中,算法终止
while(flow=dfs(1,INF))
ans+=flow;
}
return ans;
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF){
memset(map,0,sizeof(map));
int s,e,v;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&s,&e,&v);
map[s][e]+=v;
}
printf("%d\n",dinic());
}
return 0;
}
相关文章推荐
- poj 1273 & hdu 1532 Drainage Ditches(最大流 )EK,dinic模板
- POJ 1273 && HDU 1532 Drainage Ditches(最大流-Dinic)
- 网络流,增广路,Edmonds_Karp 以及 Dinic 算法(HDU 1532)
- hdu 1532 Drainage Ditches (最大流 : EK && Dinic &&Dinic 当前弧优化 4000 )
- HDU 1532 Drainage Ditches 网络流模板题(Dinic)
- hdu1532网络流(DINIC)
- 网络最大流问题算法 —— Dinic 算法 && poj 1237
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
- hdu 1532 Drainage Ditches(最大流 三种模板:EK、Dinic、isap)
- POJ 1273(HDU 1532) Drainage Ditches|HDU 3549 Flow Problem|很典型&&裸的网络流
- hdu 2732 && poj 2711 Leapin' Lizards(dinic && 拆点建图经典)
- HDU 4004 The Frog's Games(基本算法-贪心,搜索-二分)
- HDU 3987 && DINIC
- hdu 1532 POJ 1273 Drainage Ditches 和hdu 3549 Flow Problem 网络流入门(EK和dinic)
- HDU_1532 && HDU_3549(最大流EK算法模板)
- hdu1009,FatMouse' Trade,经典贪心算法
- hdu 5213 Lucky && 莫队算法的理解
- HDU 4513 吉哥系列故事——完美队形II(Manacher算法最大回文长度 && 两侧沿中点递减)
- hdu 1532(poj 1273) Drainage Ditches (网络流·最大流)
- HDU 1532 Drainage Ditches(Dinic)