# include<stdio.h>
# include<iostream>
# define M 666
using namespace std;
const int inf=2100000000;
int n,nb,nc,m;
int flow[M][M];//邻接矩阵
int source,end,s,t;//源点,汇点
int sap()
{
int gap[M];//标号为i节点的数量
int dist[M];//标号
int cur[M];//当前弧
int pre[M]; //当前流路径中前驱
s=source;t=end;
memset(cur,0,sizeof(cur));
memset(dist,0,sizeof(dist));
memset(gap,0,sizeof(gap));
int u=pre[s]=s;//u代表当前节点
int maxflow=0,aug=inf;//maxflow代表最大流,aug代表当前流
gap[0]=n;
while(dist[s]<n)
{
int flagloop=0;
for(int v=cur[u];v<n;v++)
if(flow[u][v]&&dist[u]==dist[v]+1)
{
flagloop=1;
cur[u]=v;
aug=min(aug,flow[u][v]);
pre[v]=u;
u=v;
if(v==t)
{
maxflow+=aug;
for(u=pre[u];v!=s;v=u,u=pre[u])
flow[u][v]-=aug,flow[v][u]+=aug;
aug=inf;
}
if(flagloop==1)break;
}
if(flagloop==1)continue;
int mind=n;
for(int v=0;v<n;v++)
if(flow[u][v]&&(mind>dist[v]))
{
cur[u]=v;
mind=dist[v];
}
if((--gap[dist[u]])==0) break;
gap[dist[u]=mind+1]++;
u=pre[u];
}
return maxflow;
}
int main()
{
int x,y,c;
while(~scanf("%d%d%d%d",&n,&nb,&nc,&m))
{
memset(flow,0,sizeof(flow));
source=0;
end=n+1;
for(int i=0;i<m;i++)
{
while(getchar()!='(');
scanf("%d,%d)%d",&x,&y,&c);
flow[x+1][y+1]+=c;
}
for(int i=0;i<nb;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
flow[source][x+1]+=c;
}
for(int i=0;i<nc;i++)
{
while(getchar()!='(');
scanf("%d)%d",&x,&c);
flow[x+1][end]+=c;
}
n+=2;
printf("%d\n",sap());
}
return 0;
}
poj 1459 Power Network sap + gap
最新推荐文章于 2018-12-03 22:37:22 发布