解题思路:这是一道最大流模板题。虽然知道dinic算法更适合一些,但还是用来练练Ford-Fulkerson算法。复杂度为O(F|E|)),不知道怎么算的。。。我觉得该算法相较于dinic算法的优点就是代码量小,写的快。对时间要求不高时,可以用!!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int cnt,ca;
struct node
{
int v,w,next;
}s[2006];
int n,m;
int head[16];
int used[16];
const int inf=0x3f3f3f3f;
int dfs(int v,int t,int f)
{
if(v==t) return f;
used[v]=1;
for(int i=head[v];i!=-1;i=s[i].next)
{
int p=s[i].v;
int c=s[i].w;
if(!used[p]&&c>0)
{
int d=dfs(p,t,min(f,c));
if(d>0)
{
s[i].w-=d;
s[i^1].w+=d;
return d;
}
}
}
return 0;
}
void max_flow()
{
int flow=0;
while(1)
{
memset(used,0,sizeof(used));
int f=dfs(1,n,inf);
if(f==0) break;
flow+=f;
}
printf("Case %d: %d\n",++ca,flow);
}
void add_edge(int x,int y,int c)
{
s[cnt].v=y;
s[cnt].w=c;
s[cnt].next=head[x];
head[x]=cnt++;
s[cnt].v=x;
s[cnt].w=0;
s[cnt].next=head[y];
head[y]=cnt++;
}
int main()
{
int T,x,y,c;
//freopen("t.txt","r",stdin);
scanf("%d",&T);
ca=0;
while(T--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
cnt=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&c);
add_edge(x,y,c);
}
max_flow();
}
return 0;
}