您的位置:首页 > 其它

hdu 3549 Flow Problem 最大流入门 EK算法

2012-11-08 21:46 447 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3549

核心思想:通过广搜搜来找增广路(简单的说就是可以增大流量的路),找的同时记录路径,到达汇点的时候根据记录的路径更新残量网路,一直到找不到增广路

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1005;
int map[20][20];
int col
,p
;//分别用来记录点是否已经搜到和记录点的父亲(记录路径)
int n,ans;
int Max_flow()
{
while(1)
{
queue<int> q;
memset(col,0,sizeof(col));
memset(p,0,sizeof(p));
q.push(1);
col[1]=1;
while(!q.empty())   //找增广路
{
int u=q.front();q.pop();
if(u==n) break;
for(int v=1;v<=n;v++)
if(!col[v]&&map[u][v])
{
q.push(v);  //加入队列
p[v]=u;     //记录父节点
col[v]=1;
}
}
if(!col
) break;   //找不到当前已经是最大流
int min=999999;
for(int u=n;u>1;u=p[u])
if(min>map[p[u]][u]) min=map[p[u]][u];   //找这条路上的最小流量
for(int u=n;u>1;u=p[u])
{
map[p[u]][u]-=min;  //更新反向流量
map[u][p[u]]+=min;  //更新正向流量
}
ans+=min;              //更新从s流出的流量
}
return ans;
}
int main()
{
int t,m,a,b,c,count;
cin>>t;
for(count=1;count<=t;count++)
{
cin>>n>>m;
memset(map,0,sizeof(map));
for(int i=0;i<m;i++)
{
cin>>a>>b>>c;
map[a][b]+=c;
}
ans=0;
Max_flow();
cout<<"Case "<<count<<": "<<ans<<endl;
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: