标签:
之前似乎网络流的建图题做得比较少啊…现在来做一点。
首先是模板。
poj1273 草地排水
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <limits> #include <set> #include <map> using namespace std; #define SZ 233333 int n,M=1; typedef long long ll; int fst[SZ],nxt[SZ],vb[SZ]; ll cap[SZ]; void ad_dl(int a,int b,ll c) { ++M; nxt[M]=fst[a]; fst[a]=M; vb[M]=b; cap[M]=c; } void addl(int a,int b,ll c) { ad_dl(a,b,c); ad_dl(b,a,0); } int S,T,q[SZ],d[SZ]; bool bfs() { memset(d,-1,sizeof(d)); d[S]=0; q[1]=S; int h=1,t=2; while(h!=t) { int cur=q[h++]; for(int e=fst[cur];e;e=nxt[e]) { int b=vb[e]; if(d[b]==-1&&cap[e]);else continue; d[b]=d[cur]+1; q[t++]=b; } } return d[T]!=-1; } ll dfs(int x,ll f) { if(f<=0) return 0; if(x==T) return f; ll ca=0; for(int e=fst[x];e;e=nxt[e]) { int b=vb[e]; if(d[b]!=d[x]+1) continue; ll w=dfs(b,min(cap[e],f-ca)); cap[e]-=w; cap[e^1]+=w; ca+=w; if(ca==f) break; } if(!ca) d[x]=-1; return ca; } #define inf 100000000000000000LL ll dinic() { ll ans=0; while(bfs()) ans+=dfs(S,inf); return ans; } int main() { int m; while(scanf("%d%d",&m,&n)!=EOF) { memset(fst,0,sizeof(fst)); M=1; for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); addl(a,b,c); } S=1; T=n; printf("%d\n",dinic()); } }
poj2135 农场之旅
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <limits> #include <set> #include <map> using namespace std; #define SZ 233333 typedef long long ll; int M=1,S,T,fst[SZ],nxt[SZ],va[SZ],vb[SZ]; ll cap[SZ],cost[SZ]; void ad_dl(int a,int b,ll ca,ll co) { ++M; nxt[M]=fst[a]; fst[a]=M; va[M]=a; vb[M]=b; cap[M]=ca; cost[M]=co; } void addl(int a,int b,ll ca,ll co) {ad_dl(a,b,ca,co); ad_dl(b,a,0,-co);} ll dis[SZ]; int n,q[SZ],fe[SZ]; bool inq[SZ]; bool spfa() { ll inf=2000000000000000LL; for(int i=1;i<=n;i++) dis[i]=inf; inq[S]=1; q[1]=S; dis[S]=0; int h=1,t=2; while(h!=t) { int cur=q[h++]; h&=131071; for(int e=fst[cur];e;e=nxt[e]) { if(!cap[e]||dis[vb[e]]<=dis[cur]+cost[e]) continue; int b=vb[e],co=cost[e]; dis[b]=dis[cur]+co; fe[b]=e; if(!inq[b]) {inq[b]=1; q[t++]=b; t&=131071;} } inq[cur]=0; } return dis[T]!=inf; } ll mcf() { ll ans=0; while(spfa()) { ll cur=2000000000000000LL; for(int i=fe[T];i;i=fe[va[i]]) cur=min(cur,cap[i]); for(int i=fe[T];i;i=fe[va[i]]) { ans+=cur*cost[i]; cap[i]-=cur; cap[i^1]+=cur; } } return ans; } int main() { int m; scanf("%d%d",&n,&m); n+=2; S=1; T=n; addl(1,2,2,0); addl(T-1,T,2,0); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); addl(a+1,b+1,1,c); addl(b+1,a+1,1,c); } printf("%d\n",(int)mcf()); }
标签:
原文地址:http://www.cnblogs.com/zzqsblog/p/5322713.html