题意:给个赤裸的最大流问题。
思路:EK+BFS解决。跟HDU1532几乎一样的。
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=;
int cap[N][N];
int flow[N][N]; int a[N];
int path[N]; vector<int> vect[N]; int BFS(int n)
{
deque<int> que;
que.push_back();
a[]=INF;
while( !que.empty() )
{
int x=que.front();
que.pop_front();
for(int i=; i<vect[x].size(); i++)
{
int t=vect[x][i];
if(!a[t] && cap[x][t]>flow[x][t])
{
path[t]=x;
a[t]=min(a[x],cap[x][t]-flow[x][t]);
que.push_back(t);
}
}
if(a[n]) return a[n];
}
return ; //没有增广路了
} int cal(int n)
{
int ans_flow=;
while(true)
{
memset(a, , sizeof(a));
memset(path, , sizeof(path)); int tmp=BFS(n);
if(!tmp) return ans_flow;
ans_flow+=tmp; int ed=n;
while(ed!=)
{
int from=path[ed];
flow[from][ed]+=tmp;
flow[ed][from]-=tmp;
ed=from;
}
} } int main()
{
freopen("input.txt", "r", stdin);
int t, n, m, st, ed, ca, j=;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++) vect[i].clear();
memset(cap, , sizeof(cap));
memset(flow, , sizeof(flow)); for(int i=; i<m; i++)
{
scanf("%d%d%d", &st, &ed, &ca);
vect[st].push_back(ed);
vect[ed].push_back(st);
cap[st][ed]+=ca;
} printf("Case %d: %d\n",++j, cal(n));
}
return ;
}
AC代码