/*************************************************************************
> File Name: poj1459.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/9/24 21:02:55
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 50000+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
int n,m,np,nc;
int c;
struct edge{
int be;
int to;
int f;
int next;
}E[maxn];
int head[maxn];
void init()
{
memset(head,-1,sizeof(head));
c=0;
}
void add(int x,int y,int val)
{
E[c].to=y;
E[c].f=val;
E[c].next=head[x];
head[x]=c++;
E[c].to=x;
E[c].f=0;
E[c].next=head[y];
head[y]=c++;
}
void input()
{
int i;
n++;
rep(i,m)//边的输入
{
int u,v,x;
char temp;
cin>>temp;
scanf("%d,%d)%d",&u,&v,&x);
u++,v++;//方便建立超级源点
add(u,v,x);
}
rep(i,np)//发电站
{
int x,y;
char temp;
cin>>temp;
scanf("%d)%d",&x,&y);
x++;
add(0,x,y);
}
rep(i,nc)
{
int x,y;
char temp;
cin>>temp;
scanf("%d)%d",&x,&y);
x++;
add(x,n,y);
}
}
int level[maxn];
bool makelevel(int s,int t)
{
cle(level);
int i,k,top;
level[s]=1;
int que[maxn];
int iq=0;
que[iq++]=s;
for(i=0;i<iq;i++)
{
top=que[i];
if(top==t)
return true;
for(k=head[top];k!=-1;k=E[k].next)
{
if(!level[E[k].to]&&E[k].f)
{
que[iq++]=E[k].to;
level[E[k].to]=level[top]+1;
}
}
}
return false;
}
int DFS(int now,int maxf,int t)
{
if(now==t)return maxf;
int ret=0,f,k;
for(k=head[now];k!=-1;k=E[k].next)
{
if(E[k].f&&level[E[k].to]==level[now]+1)
{
f=DFS(E[k].to,min(maxf-ret,E[k].f),t);
E[k].f-=f;
E[k^1].f+=f;
ret+=f;
if(ret==maxf)return ret;
}
}
return ret;
}
int DINIC (int s,int t)
{
int ans=0;
while(makelevel(s,t))
ans+=DFS(s,inf,t);
return ans;
}
void doit()
{
init();
input();
cout<<DINIC(0,n)<<endl;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(cin>>n>>np>>nc>>m)
{
doit();
}
return 0;
}
poj 1459 最大流(Dinic)
最新推荐文章于 2024-07-25 11:05:03 发布