需要注意的是,加反边的时候要记得边权为0,别顺手就把读入的边权写上了。
写完后拿acwing和洛谷的模板题测试过了,大家放心食用。
最大流(Acwing412. 排水沟)
#include<bits/stdc++.h>
using namespace std;
const int N=210,M=420;
int n,m,S,T,dist[N];
int q[N],hh,tt;
int h[N],e[M],ne[M],flow[M],idx;
void add(int a,int b,int v)
{
flow[idx]=v,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool bfs()
{
memset(dist,0x3f,sizeof dist);
dist[S]=0;
hh=0,tt=-1;
q[++tt]=S;
while(hh<=tt)
{
int x=q[hh++];
for(int i=h[x];~i;i=ne[i])
{
int j=e[i];
if(flow[i]&&dist[j]>dist[x]+1)
{
dist[j]=dist[x]+1;
q[++tt]=j;
}
}
}
return dist[T]<0x3f3f3f3f;
}
int dfs(int u,int fl)
{
if(u==T) return fl;
int res=0;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(dist[u]+1==dist[j]&&flow[i])
{
int x=dfs(j,min(fl,flow[i]));
res+=x,fl-=x,flow[i]-=x,flow[i^1]+=x;
if(!fl) break;
}
}
if(!res) dist[u]=2e9;//炸点优化
return res;
}
int maxflow()
{
int res=0;
while(bfs()) res+=dfs(1,INT_MAX);
return res;
}
int main()
{
memset(h,-1,sizeof h);
cin>>m>>n;
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z),add(y,x,0);
}
S=1,T=n;
cout<<maxflow();
return 0;
}
最小费用最大流(洛谷P3381)
#include<bits/stdc++.h>
using namespace std;
const int N=50005,M=50000*2+5;
int h[N],e[M],ne[M],flow[M],cost[M],idx;
int n,m,S,T;
int dist[N],pre[N];
bool st[N];
void add(int a,int b,int v,int c)
{
flow[idx]=v,cost[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool spfa()
{
for(int i=1;i<=n;i++) dist[i]=2e9,st[i]=false,pre[i]=-1;
dist[S]=0;
queue<int> q;
q.push(S);
st[S]=true;
while(q.size())
{
int x=q.front();q.pop();
st[x]=false;
for(int i=h[x];~i;i=ne[i])
{
int j=e[i];
if(flow[i]&&dist[j]>dist[x]+cost[i])
{
dist[j]=dist[x]+cost[i];
pre[j]=i;
if(!st[j]) st[j]=true,q.push(j);
}
}
}
if(pre[T]==-1) return false;
return true;
}
int maxflow(int &c)
{
int res=0;
while(spfa())
{
int minv=INT_MAX,cur=pre[T];
while(cur!=-1)
minv=min(minv,flow[cur]),cur=pre[e[cur^1]];
cur=pre[T];
while(cur!=-1)
flow[cur]-=minv,flow[cur^1]+=minv,c+=cost[cur]*minv,cur=pre[e[cur^1]];
res+=minv;
}
return res;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m>>S>>T;
while(m--)
{
int x,y,z,c;
scanf("%d%d%d%d",&x,&y,&z,&c);
add(x,y,z,c),add(y,x,0,-c);
}
int c=0;
int ans=maxflow(c);
cout<<ans<<' '<<c<<endl;
return 0;
}