这是一道最大流的模版题
可以给初学网络流的同学练练手
#include<iostream>
#include<queue>
#include<cstring>
#include<string.h>
using namespace std;
const int N=1005;
const int inf=999999999;
int map[N][N],p[N],n,m;
bool vis[N];
bool bfs()
{
int cur;
queue<int>q;
memset(vis,false,sizeof(vis));
memset(p,0,sizeof(p));
vis[1]=true;
q.push(1);
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur==n)
return true;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&map[cur][i])
{
q.push(i);
p[i]=cur;
vis[i]=true;
}
}
}
return false;
}
int maxflow()
{
int ans=0,i;
int MIN=inf;
while(true)
{
if(!bfs())
return ans;
for(i=n;i!=1;i=p[i])
MIN=min(MIN,map[p[i]][i]);
for(i=n;i!=1;i=p[i])
{
map[p[i]][i]-=MIN;
map[i][p[i]]+=MIN;//添加反向边 这是EK算法的一个重点
}
ans+=MIN;
}
}
int main()
{
int t,a,b,c,cas;
cin>>t;
cas=1;
while(t--)
{
cin>>n>>m;
int i;
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
cin>>a>>b>>c;
map[a][b]+=c;
}
cout<<"Case "<<cas<<": "<<maxflow()<<endl;
cas++;
}
return 0;
}