第一个dinic
没有用邻接表 效率有点低
#include<iostream>
#include<string.h>
#include<queue>
#include<stdio.h>
#include<limits.h>
#define MAX 102
using namespace std;
int cap[MAX][MAX];
int lev[MAX];
bool bfs(int s,int t)
{
int v,j;
queue<int>q;
q.push(s);
memset(lev,-1,sizeof(lev));
lev[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(v=0;v<=t;v++)
{
if(lev[v]==-1&&cap[u][v]>0)
{
lev[v]=lev[u]+1;
q.push(v);
}
}
}
return lev[t]!=-1;
}
int dinic(int s,int t)
{
int stack[MAX],top,pre[MAX],u,v,i,last[MAX];
int f[MAX],minf,sum=0,at,flag;
while(bfs(s,t))
{
top=1;
stack[1]=s;
memset(last,-1,sizeof(last));
while(top)
{
u=stack[top];
//cout<<top<<" "<<u<<endl;
if(u==t)
{
minf=INT_MAX;
for(i=1;i<top;i++)
{
v=stack[i];
if(minf>cap[v][last[v]])
{
minf=cap[v][last[v]];
at=i;
}
}
for(i=1;i<top;i++)
{
v=stack[i];
cap[v][last[v]]-=minf;
cap[last[v]][v]+=minf;
}
sum+=minf;
top=at;
continue;
}
flag=0;
for(v=last[u]+1;v<=t;v++)
{
if(cap[u][v]>0&&lev[u]+1==lev[v])
{
stack[++top]=v;
last[u]=v;
flag=1;
break;
}
}
if(flag)continue;
top--;
}
}
return sum;
}
int main()
{
int n,m,np,nc,u,v,c;
int i;
while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
{
memset(cap,0,sizeof(cap));
while(m--)
{
scanf(" (%d,%d)%d",&u,&v,&c);
cap[u][v]=c;
}
while(np--)
{
scanf(" (%d)%d",&u,&c);
cap[n][u]=c;
}
while(nc--)
{
scanf(" (%d)%d",&u,&c);
cap[u][n+1]=c;
}
printf("%d\n",dinic(n,n+1));
}
}