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

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[N],p[N];//分别用来记录点是否已经搜到和记录点的父亲(记录路径)
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[n]) 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;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值