題意
草地排水
解
網絡流
代碼
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define For(i,j,k) for(int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(int i=(j);i>=(int)k;i--)
#define Set(a,b) memset(a,b,sizeof(a))
#define Rep(i,u) for(int i=Begin[u],v=to[i];i;i=Next[i],v=to[i])
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int Begin[N],Next[N<<1],to[N<<1],e=1,f[N<<1],n,m;
inline void add(int x,int y,int z){
to[++e]=y,Next[e]=Begin[x],Begin[x]=e,f[e]=z;
}
template<class T>inline void chkmin(T &a,T b){a=(a>b)?b:a;}
template<class T>inline void chkmax(T &a,T b){a=(a<b)?b:a;}
inline void read(int &x){
x=0;char c=getchar();int f(0);
while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
x=f?-x:x;
}
struct isap{
int s,t,p[N],gap[N],cur[N],d[N];
#define Retr(u) for(u=t;u^s;u=to[p[u]^1])
inline void init(){
queue<int>q;
For(i,0,n)cur[i]=Begin[i],d[i]=INF,gap[i]=0;
d[t]=0;gap[0]=1;
q.push(t);
while(!q.empty()){
int r=q.front();q.pop();
Rep(i,r)
if(f[i^1]&&d[v]>d[r]+1)
++gap[d[v]=d[r]+1],q.push(v);
}
}
inline int Augment(){
int u,a=INF;
Retr(u)chkmin(a,f[p[u]]);
Retr(u)f[p[u]]-=a,f[p[u]^1]+=a;
return a;
}
inline int Maxflow(int S,int T){
int flow=0,u=s=S,i;t=T;
init();
while(d[s]<n){
if(u==t)flow+=Augment(),u=s;
for(i=cur[u];i;i=Next[i])
if(f[i]&&d[u]==d[to[i]]+1)break;
if(!i){
if((--gap[d[u]])==0)break;
cur[u]=Begin[u];d[u]=n;
Rep(i,u)
if(f[i])chkmin(d[u],d[to[i]]+1);
gap[d[u]]++;
if(u!=s)u=to[p[u]^1];
}else cur[u]=i,p[u=to[i]]=i;
}
return flow;
}
}F;
int main(){
while(scanf("%d%d",&m,&n)==2){
Set(Begin,0);e=1;
For(i,1,m){
int u,v,w;
read(u),read(v),read(w);
add(u,v,w),add(v,u,0);
}
printf("%d\n",F.Maxflow(1,n));
}
return 0;
}