这是一道网络流的模板题,只要知道网络流的基本概念应该就能水过,在此只贴代码,有空我会写一篇网络流入门的文章供还没有接触过网络流的朋友阅读。
代码:
#include<cstdio>
#include<cstdlib>
#include<queue>
#define MAX 210
#define oo 10000001
using namespace std;
int map[MAX][MAX],arcs,nodes,_max,layer[MAX];
bool table[MAX];
FILE *in,*out;
void DFS(int *list,int index);
void flow(void);
bool BFS();
int main()
{
in=fopen("ditch.in","r");
out=fopen("ditch.out","w");
fscanf(in,"%d%d",&arcs,&nodes);
for(int i=0;i<arcs;i++)
{
int a,b,c;
fscanf(in,"%d%d%d",&a,&b,&c);
map[a][b]+=c;
}
flow();
fprintf(out,"%d\n",_max);
fclose(in);
fclose(out);
return 0;
}
void flow(void)
{
int path[MAX];
while(BFS())
{
for(int i=1;i<=nodes;i++) table[i]=false;
table[0]=true;
path[0]=1;
DFS(path,0);
}
}
bool BFS()
{
queue <int> myqueue;
for(int i=0;i<MAX;i++) layer[i]=MAX;
myqueue.push(1);
layer[1]=1;
while(!myqueue.empty())
{
int p=myqueue.front();
myqueue.pop();
for(int i=2;i<=nodes;i++)
{
if(map[p][i]>0 && layer[i]>layer[p]+1)
{
layer[i]=layer[p]+1;
myqueue.push(i);
}
}
}
if(layer[nodes]<MAX) return true;
else return false;
}
void DFS(int *list,int index)
{
int p=list[index];
if(p==nodes)
{
int min=oo;
for(int i=1;i<=index;i++)
{
int a=list[i-1];
int b=list[i];
if(map[a][b]<min) min=map[a][b];
}
_max+=min;
for(int i=1;i<=index;i++)
{
int a=list[i-1];
int b=list[i];
map[a][b]-=min;
map[b][a]+=min;
}
return ;
}
for(int i=2;i<=nodes;i++)
{
if(map[p][i]>0 && table[i]==false && layer[p]<layer[i])
{
list[index+1]=i;
table[i]=true;
DFS(list,index+1);
table[i]=false;
}
}
}