已经好几天没写解题报告了,今天年初一,呵呵,写一个,为今年开个好头。下面步入正题:
POJ1459这道题目的要求是求最大的消耗量。我们添加一个源点s和一个汇点t,与s相连的是所有的np(生产点),边权值为其自己能产生的数值;与t相连的是所有的nc(消耗点),边权值为其消耗最大值。至此便完成了网络的构图。然后直接套用最大流的算法模版即可解决。我使用的是EK算法。
什么是EK算法?EK算法的原理是利用BFS或者DFS每次找到网络中的一条增广路径,然后修改其流量值,直至无法找到增广路径为止。
下面给出EK的源代码:
#include <iostream>
#include <memory.h>
#include <stdio.h>
#define max 65535
using namespace std;
int s,t,n,np,nc,m,tot;
int pre[102],d[102],fx[102],f[102][102],c[102][102];
char str[50];
bool visit[102];
void init()
{
int i,x,y,z;
memset(f,0,sizeof(f));//f数组表示网络边的流量
memset(c,0,sizeof(c));//c数组表示网络边的容量
s=n;
t=n+1;
n+=2;
for(i=1;i<=m;i++)
{
scanf("%s",&str);
sscanf(str,"(%d,%d)%d",&x,&y,&z);
c[x][y]=z;
}
for(i=1;i<=np;i++)
{
scanf("%s",&str);
sscanf(str,"(%d)%d",&x,&z);
c[s][x]=z;