最大流复习
最大流就是最原始的网络流,有源点和汇点源点是无穷大
FF算法(思想很简单就是先找一个增广路径,然后构建残余网络,在残余网络中继续找增广路径.....直到找不到累加的流量就是最大值(具体原理可以通过最小割证明))
#include <iostream> #include <cstring> using namespace std; const int N =1010; const int M =20010; int n,m; int h[N],to[M],ne[M],cap[M],vi[N],idx=0; void add(int a,int b,int w){ to[idx]=b; ne[idx]=h[a]; cap[idx]=w; h[a]=idx++; } int dfs(int v,int t,int f){ if(v==t)return f; vi[v]=1; for(int i=h[v];~i;i=ne[i]){ int tem=to[i]; if(!vi[tem]&&cap[i]>0){ int d=dfs(tem,t,min(f,cap[i])); if(d>0){ //如果搜到一个流量大于0那么就停止 cap[i]-=d; //i+1为反向边 cap[i^1]+=d; return d; } } } return 0; } int max_f(int s,int t){ int flow=0; while(true){ memset(vi,0,sizeof(vi)); int f=dfs(s,t,0x3f); if(f==0)return flow; flow+=f; } } int main(){ cin>>n>>m; memset(h,-1,sizeof h); for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c; add(a,b,c); add(b,a,0); } cout<<max_f(1,n)<<endl; }

浙公网安备 33010602011771号