Dinic=bfs+dfs = =
用bfs算出到原点的最短路径(每条残存都算1)
然后每次都跑两端只差1的路径跑dfs,并且一直跑到不能跑
一个优化:如果一个点流出的量已经到流入量了就可以返回上一层楼(显然)
1 #include <cstdio> 2 #define INF 9223372036854775807 3 int n,m,x,y,z,M=1;long long ans=0; 4 int d[5001],l[5001],fir[5001],nex[60005],to[60005],wei[60005]; 5 int min(long long a,long long b){if(a<b) return a;else return b;} 6 void add(int x,int y,int z){to[++M]=y;wei[M]=z;nex[M]=fir[x];fir[x]=M;} 7 long long dfs(int now,long long flow) 8 { 9 if(now==n) 10 return flow; 11 long long used=0; 12 for(int i=fir[now];i;i=nex[i]) 13 if(d[to[i]]==d[now]+1 && wei[i]) 14 { 15 int fl=dfs(to[i],min(flow-used,wei[i])); 16 wei[i]-=fl,wei[i^1]+=fl; 17 used+=fl; 18 if(used==flow) 19 return flow; 20 } 21 return used; 22 } 23 bool bfs() 24 { 25 int h=0,t=1; 26 l[1]=1;d[1]=0; 27 for(int i=2;i<=n;i++) d[i]=-1; 28 while(h<t) 29 for(int i=fir[l[++h]];i;i=nex[i]) 30 if(wei[i] && (d[to[i]]==-1)) 31 l[++t]=to[i],d[l[t]]=d[l[h]]+1; 32 return d[n]+1; 33 } 34 int main() 35 { 36 for(scanf("%d%d",&n,&m);m;m--) 37 scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z); 38 while(bfs()) ans+=dfs(1,INF); 39 printf("%lld ",ans); 40 return 0; 41 }
= =怒压代码