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;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章