多源点多汇点的网络流其实处理方法很简单...给所有源点加一个超级源点...给所有汇点加一个超级汇点...然后赤果果的最大流....
/*
POJ1459 多源点多汇点最大流..Dinic模板题..
*/
#include<iostream>
using namespace std;
const int oo=2000000000;
int n,np,nc,m,Network[110][110],Road[110],Dis[110],ans;
bool FindARoad;
int BFS()
{
int Myqueue[110],h,p,i;
bool used[110];
memset(Dis,0,sizeof(Dis));
memset(used,false,sizeof(used));
Dis[1]=1; used[1]=true;
h=p=1; Myqueue[1]=1;
while (h<=p)
{
for (i=1;i<=n;i++)
if (!used[i] && Network[Myqueue[h]][i])
{
p++;
Myqueue[p]=i;
used[i]=true;
Dis[i]=Dis[Myqueue[h]]+1;
}
h++;
}
return Dis[n];
}
void DFS(int num,int Lroad,int MinFlow)
{
int i;
Road[Lroad]=num;
if (num==n)
{
ans+=MinFlow;
FindARoad=true;
for (i=1;i<Lroad;i++)
{
Network[Road[i]][Road[i+1]]-=MinFlow;
Network[Road[i+1]][Road[i]]+=MinFlow;
}
return;
}
for (i=1;i<=n;i++)
if (Dis[i]-Dis[num]==1 && Network[num][i] )
{
DFS(i,Lroad+1,MinFlow<Network[num][i]?MinFlow:Network[num][i]);
if (FindARoad)
{
if (!Network[num][i]) FindARoad=false;
return;
}
}
}
void Dinic()
{
while (BFS())
{
FindARoad=false;
DFS(1,1,oo);
}
}
int main()
{
freopen("1459.in","r",stdin);
freopen("1459.out","w",stdout);
while (scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
{
n+=2;
memset(Network,0,sizeof(Network));
int x,y,i,d;
char c;
for (i=1;i<=m;i++)
{
scanf("%c",&c); while (c!='(') scanf("%c",&c); ;
scanf("%d%c",&x,&c); while (c!=',') scanf("%c",&c);
scanf("%d%c",&y,&c); while (c!=')') scanf("%c",&c);
scanf("%d",&d);
Network[x+2][y+2]+=d;
}
for (i=1;i<=np;i++)
{
scanf("%c",&c); while (c!='(') scanf("%c",&c); ;
scanf("%d%c",&x,&c); while (c!=')') scanf("%c",&c);
scanf("%d",&d);
Network[1][x+2]+=d;
}
for (i=1;i<=nc;i++)
{
scanf("%c",&c); while (c!='(') scanf("%c",&c); ;
scanf("%d%c",&x,&c); while (c!=')') scanf("%c",&c);
scanf("%d",&d);
Network[x+2][n]+=d;
}
ans=0; Dinic();
printf("%d\n",ans);
}
return 0;
}
为毛我的Dinic速度不大给力??请大牛指导~~~