/*
ID: shenxyy1
TASK: ditch
LANG: C++11
*/
#include<bits/stdc++.h>
using namespace std;
#define REP(i,j,k) for (int i = (j), _end_ =(k); i <= _end_; ++i)
#define DREP(i,j,k) for (int i = (j), _start_ =(k); i >= _end_; --i)
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()-1))
#define ALL(x) ((x).begin()+1), (x).end()
template<typename T> inline bool chkmin(T &a,const T &b){ return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a,const T &b){ return a < b ? a = b, 1 : 0; }
typedef long long LL;
const int dmax=1010,oo=0x3f3f3f3f;
int n,m;
int a[dmax][dmax] ,ans;
int d[dmax],gap[dmax],low[dmax],pre[dmax];
void bfs(){
int f,l ,q[dmax];
memset(d,0x3f,sizeof(d));
f=l=0;
q[++l]=n;
d[n]=0;
gap[0]++;
while (f<l){
int k=q[++f];
REP(i,1,n)
if (d[i]==oo && a[i][k]){
d[i]=d[k]+1;
gap[d[i]]++;
q[++l]=i;
}
}
}
void sap(){
bfs();
pre[1]=-1;
low[1]=oo;
int t=1;
while (d[1]<n){
int i,flag=0;
for (i = 1; i <= n; ++i)
if (d[t]==d[i]+1 && a[t][i]>0){
flag=1;
break;
}
if (flag){
low[i]=min(a[t][i],low[t]);
pre[i]=t;
t=i;
if (t==n){
int j=n,flow=low[n];
ans+=flow;
while (pre[j]!=-1){
int k=pre[j];
a[k][j]-=flow;
a[j][k]+=flow;
j=pre[j];
}
t=1;
}
}else{
--gap[d[t]];
if (gap[d[t]]==0)
break;
d[t]=n;
REP(i,1,n)
if (a[t][i]>0)
chkmin(d[t],d[i]+1);
gap[d[t]]++;
if (t!=1)
t=pre[t];
}
}
}
int main(){
freopen("ditch.in","r",stdin);
freopen("ditch.out","w",stdout);
scanf("%d%d",&m,&n);
REP(i,1,m){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[x][y]+=z;
}
sap();
printf("%d\n",ans);
return 0;
}
USACO 4.2.1 网络流 SAP
最新推荐文章于 2017-08-09 19:34:00 发布