板子
P3376 【模板】网络最大流
#include<bits/stdc++.h>
#define inf 1e18
using namespace std;int n,m,s,t;
typedef long long LL;
const int N=210,M=1e4+10;
int h[N],to[M],w[M],ne[M],idx=1;
void add(int a,int b,int c){to[++idx]=b;ne[idx]=h[a];h[a]=idx;w[idx]=c;
}
int dep[N],now[N];
bool bfs(){for(int i=1;i<=n;i++){dep[i]=-1;now[i]=h[i];}queue<int> q;q.push(s);dep[s]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=ne[i]){int v=to[i];if(w[i]&&dep[v]==-1){dep[v]=dep[u]+1;q.push(v);}}}return dep[t]!=-1;
}
LL dfs(int u,LL las){if(u==t) return las;LL ans=0;for(int i=now[u];i&&las;i=ne[i]){int v=to[i];now[u]=i;if(w[i]&&dep[u]+1==dep[v]){int res=dfs(v,min(las,(LL)w[i]));ans+=res;las-=res;w[i]-=res;w[i^1]+=res;}}if(ans==0) dep[u]=-1;return ans;
}
LL Dinic(){LL ans=0;while(bfs()) ans+=dfs(s,inf);return ans;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>s>>t;while(m--){int a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,0);}cout<<Dinic()<<"\n";return 0;
}
P3381 【模板】最小费用最大流
#include<bits/stdc++.h>
#define inf 1e9+10
using namespace std;
const int N=5010,M=1e5+10;int n,m,s,t;
int h[N],to[M],w[M],c[M],ne[M],idx=1;
int dis[N],vis[N];
int now[N];
void add(int u,int v,int ww,int cc){to[++idx]=v;w[idx]=ww;ne[idx]=h[u];h[u]=idx;c[idx]=cc;
}
bool bfs(){for(int i=1;i<=n;i++){now[i]=h[i];dis[i]=inf;}queue<int> q;q.push(s);dis[s]=0;vis[s]=1;while(q.size()){int u=q.front();q.pop();vis[u]=0;for(int i=h[u];i;i=ne[i]){int v=to[i];if(w[i]&&dis[v]>dis[u]+c[i]){dis[v]=dis[u]+c[i];if(vis[v]) continue;vis[v]=1;q.push(v);}}}return dis[t]!=inf;
}
int cosn=0;
int dfs(int u,int las){if(u==t) return las;int ans=0;vis[u]=1;for(int i=now[u];i&&las;i=ne[i]){int v=to[i];now[u]=i;if(dis[v]==dis[u]+c[i]&&w[i]&&!vis[v]){int res=dfs(v,min(las,w[i]));ans+=res;las-=res;w[i]-=res;w[i^1]+=res;cosn+=res*c[i];}}vis[u]=0;if(ans==0) dis[u]=inf;return ans;
}
int Dinic(){int ans=0;while(bfs()) ans+=dfs(s,inf);return ans;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m>>s>>t;while(m--){int u,v,w,c;cin>>u>>v>>w>>c;add(u,v,w,c);add(v,u,0,-c);}cout<<Dinic()<<" ";cout<<cosn<<"\n";return 0;
}
P14578 【模板】无源汇上下界可行流
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
const int N=1010,M=(1e4+2*N)*2;int n,m,s,t;
int h[N],ne[M],w[M],to[M],idx=1;
int beg[M];
int in[N];
void add(int a,int b,int c){to[++idx]=b;ne[idx]=h[a];h[a]=idx;w[idx]=c;
}
int Graph(){for(int i=1;i<=m;i++){int a,b,l,r;cin>>a>>b>>l>>r;r-=l;add(a,b,r);add(b,a,0);in[b]+=l;in[a]-=l;beg[i]=l;}s=n+1;t=n+2;int ans=0;for(int i=1;i<=n;i++){if(in[i]>0){add(s,i,in[i]);add(i,s,0);ans+=in[i]; }else{add(i,t,-in[i]);add(t,i,0);}}return ans;
}
int dep[N],now[N];
bool bfs(){for(int i=0;i<N;i++){dep[i]=-1;now[i]=h[i];}queue<int> q;q.push(s);dep[s]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=ne[i]){int v=to[i];if(w[i]&&dep[v]==-1){dep[v]=dep[u]+1;q.push(v);}}}return dep[t]!=-1;
}
int dfs(int u,int las){if(u==t) return las;int ans=0;for(int i=now[u];i&&las;i=ne[i]){int v=to[i];now[u]=i;if(w[i]&&dep[v]==dep[u]+1){int res=dfs(v,min(las,w[i]));las-=res;ans+=res;w[i]-=res;w[i^1]+=res;}}if(ans==0) dep[u]=-1;return ans;
}
int Dinic(){int ans=0;while(bfs()) ans+=dfs(s,inf);return ans;
}
int main(){cin>>n>>m;int num=Graph();int ans=Dinic();if(num!=ans) cout<<"No\n";else{cout<<"Yes\n";for(int i=1;i<=m;i++) cout<<beg[i]+w[i*2+1]<<"\n";}return 0;
}
P14579 【模板】有源汇上下界最大流
#include<bits/stdc++.h>
#define inf 1e9+10
using namespace std;
const int N=1010,M=(1e4+N*2)*2;int n,m,s,t,ss,tt;
int in[N];
int h[N],to[M],w[M],ne[M],idx=1;
int add(int a,int b,int c){to[++idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx;return idx;
}
int id;
int Graph(){for(int i=1;i<=m;i++){int a,b,l,r;cin>>a>>b>>l>>r;r-=l;add(a,b,r);add(b,a,0);in[b]+=l;in[a]-=l;}add(t,s,inf);id=add(s,t,0);ss=n+1,tt=n+2;int ans=0;for(int i=1;i<=n;i++){if(in[i]>0){ans+=in[i];add(ss,i,in[i]);add(i,ss,0);}else{add(i,tt,-in[i]);add(tt,i,0);}}return ans;
}
int dep[N],now[N];
bool bfs(int s,int t){for(int i=0;i<N;i++){dep[i]=-1;now[i]=h[i];}queue<int> q;q.push(s);dep[s]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=ne[i]){int v=to[i];if(w[i]&&dep[v]==-1){dep[v]=dep[u]+1;q.push(v);}}}return dep[t]!=-1;
}
int dfs(int u,int las,int t){if(u==t) return las;int ans=0;for(int i=now[u];i&&las;i=ne[i]){int v=to[i];now[u]=i;if(w[i]&&dep[v]==dep[u]+1){int res=dfs(v,min(las,w[i]),t);las-=res;ans+=res;w[i]-=res;w[i^1]+=res;}}if(ans==0) dep[u]=-1;return ans;
}
int Dinic(int s,int t){int ans=0;while(bfs(s,t)) ans+=dfs(s,inf,t);return ans;
}
int main(){cin>>n>>m>>s>>t;int num=Graph();int ans=Dinic(ss,tt);if(num!=ans) cout<<"N\n";else{int ans=w[id];w[id]=w[id^1]=0;cout<<ans+Dinic(s,t)<<"\n";}return 0;
}
P14580 【模板】有源汇上下界最小流
#include<bits/stdc++.h>
#define inf 1e9+10
using namespace std;
const int N=1010,M=(1e4+N*2)*2;int n,m,s,t,ss,tt;
int in[N];
int h[N],to[M],w[M],ne[M],idx=1;
int add(int a,int b,int c){to[++idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx;return idx;
}
int id;
int Graph(){for(int i=1;i<=m;i++){int a,b,l,r;cin>>a>>b>>l>>r;r-=l;add(a,b,r);add(b,a,0);in[b]+=l;in[a]-=l;}add(t,s,inf);id=add(s,t,0);ss=n+1,tt=n+2;int ans=0;for(int i=1;i<=n;i++){if(in[i]>0){ans+=in[i];add(ss,i,in[i]);add(i,ss,0);}else{add(i,tt,-in[i]);add(tt,i,0);}}return ans;
}
int dep[N],now[N];
bool bfs(int s,int t){for(int i=0;i<N;i++){dep[i]=-1;now[i]=h[i];}queue<int> q;q.push(s);dep[s]=1;while(q.size()){int u=q.front();q.pop();for(int i=h[u];i;i=ne[i]){int v=to[i];if(w[i]&&dep[v]==-1){dep[v]=dep[u]+1;q.push(v);}}}return dep[t]!=-1;
}
int dfs(int u,int las,int t){if(u==t) return las;int ans=0;for(int i=now[u];i&&las;i=ne[i]){int v=to[i];now[u]=i;if(w[i]&&dep[v]==dep[u]+1){int res=dfs(v,min(las,w[i]),t);las-=res;ans+=res;w[i]-=res;w[i^1]+=res;}}if(ans==0) dep[u]=-1;return ans;
}
int Dinic(int s,int t){int ans=0;while(bfs(s,t)) ans+=dfs(s,inf,t);return ans;
}
int main(){cin>>n>>m>>s>>t;int num=Graph();int ans=Dinic(ss,tt);if(num!=ans) cout<<"N\n";else{int ans=w[id];//cout<<ans<<"\n";w[id]=w[id^1]=0;cout<<ans-Dinic(t,s)<<"\n";}return 0;
}