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