您的位置:首页 > 其它

最大流问题的Ford-Fulkerson模板

2016-02-19 22:48 453 查看
详细讲解:http://blog.csdn.net/smartxxyx/article/details/9293665

下面贴上我的第一道最大流的题:

hdu3549

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<queue>
struct pp
{
int x;
int cap;
int pre;
};
const int N=1e8;
bool used[30];
using namespace std;
vector<pp>GG[30];
void add(int from,int to,int vv)
{   pp ss;
ss.cap=vv;ss.x=to;ss.pre=GG[to].size();
GG[from].push_back(ss);
ss.cap=0;ss.x=from;ss.pre=GG[from].size()-1;
GG[to].push_back(ss);
}
int dfs(int x,int y,int co)
{
if(x==y)
{
return co;
}
used[x]=true;
int i,j;
for(i=0;i<GG[x].size();i++)
{  int cc ;
pp &LL=GG[x][i];
if(!used[LL.x]&&LL.cap>0)
{
cc=dfs(LL.x,y,min(co,LL.cap));
if(cc>0)
{
LL.cap-=cc;
GG[LL.x][LL.pre].cap+=cc;
return cc;
}
}
}
return 0;
}
int max_flow(int x,int t)
{
int flow=0;
while(1)
{memset(used,0,sizeof(used));
int kk=dfs(x,t,N);
if(kk==0)
{
return flow;
}
else flow+=kk;
}

}
int main(void)
{
int i,j,k,p,q;
scanf("%d",&k);

for(i=1;i<=k;i++)
{ for(j=0;j<30;j++)
GG[j].clear();
scanf("%d %d",&p,&q);
int x;int y;int n,m;
for(j=0;j<q;j++)
{
scanf("%d %d %d",&x,&y,&n);
add(x,y,n);
}
int M=max_flow(1,p);
printf("Case %d: %d\n",i,M);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: