网络流模板
ISAP:
#include<bits/stdc++.h>
using namespace std;
namespace IO{
const int mod=998244353;
#define ll long long
#define db double
#define FLS fflush(stdout)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
inline int max(int a,int b) {return (a>b)?a:b;}
inline int min(int a,int b) {return (a<b)?a:b;}
inline int MOD(ll a) {return (a<mod)?a:a-a/mod*mod;}
inline int inc(int a,int b) {return (a+=b)>=mod?a-mod:a;}
inline int dec(int a,int b) {return (a-=b)<0?a+mod:a;}
inline ll ksm(ll a,int b) {ll res=1;while(b) {if(b&1) res=MOD(res*a);a=MOD(a*a);b>>=1;}return res;}
char buf[1<<21],*p1=buf,*p2=buf;
#define Fin(a) freopen(a".in","r",stdin)
#define Fout(a) freopen(a".out","w",stdout)
inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline int read(){
int ret=0;bool f=0;char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
return f?-ret:ret;
}
}using namespace IO;
const int N=210,M=5010,inf=1e9;
int n,m,s,t,head[N],cnt=1,cur[N],dep[N],gap[N];
struct edge{int v,w,nxt;}e[M<<1];
inline void add(int u,int v,int w) {e[++cnt]=edge{v,w,head[u]};head[u]=cnt;}
inline void note_h() {
memset(dep,-1,sizeof(dep));
queue<int> q;dep[t]=0;++gap[0];q.push(t);
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(dep[v]!=-1) continue;
dep[v]=dep[u]+1;
++gap[dep[v]];
q.push(v);
}
}
}
ll maxflow=0;
int dfs(int u,int flow) {
if(u==t) {
maxflow+=flow;
return flow;
}
int res=0;
for(int i=cur[u];i;i=e[i].nxt) {
int v=e[i].v;cur[u]=i;
if(dep[v]+1==dep[u] && e[i].w) {
int Mi=dfs(v,min(e[i].w,flow-res));
e[i].w-=Mi;
e[i^1].w+=Mi;
res+=Mi;
}
if(res==flow) return flow;
}
if(!--gap[dep[u]]) dep[s]=n+1;
++gap[++dep[u]];
return res;
}
inline ll ISAP() {
note_h();
while(dep[s]<n) memcpy(cur,head,sizeof(head)),dfs(s,inf);
return maxflow;
}
signed main(){
#ifdef LOCAL
Fin("P3376_1");Fout("1");
#endif
n=read();m=read();s=read();t=read();
FOR(i,1,m) {
int u=read(),v=read(),w=read();
add(u,v,w);add(v,u,0);
}printf("%lld\n",ISAP());
#ifdef LOCAL
fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
return 0;
}
费用流(MCMF)
#include<bits/stdc++.h>
using namespace std;
namespace IO{
const int mod=998244353;
#define ll long long
#define db double
#define FLS fflush(stdout)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
inline int max(int a,int b) {return (a>b)?a:b;}
inline int min(int a,int b) {return (a<b)?a:b;}
inline int MOD(ll a) {return (a<mod)?a:a-a/mod*mod;}
inline int inc(int a,int b) {return (a+=b)>=mod?a-mod:a;}
inline int dec(int a,int b) {return (a-=b)<0?a+mod:a;}
inline ll ksm(ll a,int b) {ll res=1;while(b) {if(b&1) res=MOD(res*a);a=MOD(a*a);b>>=1;}return res;}
char buf[1<<21],*p1=buf,*p2=buf;
#define Fin(a) freopen(a".in","r",stdin)
#define Fout(a) freopen(a".out","w",stdout)
inline int getchar(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
inline int read(){
int ret=0;bool f=0;char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f=1;ch=getchar();}
while(ch>='0' && ch<='9') {ret=(ret<<1)+(ret<<3)+ch-48;ch=getchar();}
return f?-ret:ret;
}
}using namespace IO;
const int N=5e3+10,M=5e4+10,inf=1e9;
int n,m,s,t,head[N],cnt=1;
struct edge{int v,w,dis,nxt;}e[M<<1];
inline void add(int u,int v,int w,int dis) {
e[++cnt]=edge{v,w,dis,head[u]};head[u]=cnt;
}
int maxflow,mincost;
int dis[N],W[N],vis[N],pre[N];
inline int spfa() {
memset(dis,0x3f,sizeof(dis));
queue<int> q;q.push(s);dis[s]=0;W[s]=inf;
while(q.size()) {
int u=q.front();q.pop();vis[u]=0;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(!e[i].w) continue ;
if(dis[v]>dis[u]+e[i].dis) {
dis[v]=dis[u]+e[i].dis;
W[v]=min(W[u],e[i].w);
pre[v]=i;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
if(dis[t]==dis[n+1]) return 0;
return 1;
}
inline void MCMF() {
while(spfa()) {
maxflow+=W[t];
mincost+=W[t]*dis[t];
int x=t,i;
while(x!=s) {
i=pre[x];
e[i].w-=W[t];
e[i^1].w+=W[t];
x=e[i^1].v;
}
}
}
signed main(){
#ifdef LOCAL
Fin("1");Fout("1");
#endif
n=read();m=read();s=read();t=read();
FOR(i,1,m) {
int u=read(),v=read(),w=read(),dis=read();
add(u,v,w,dis);
add(v,u,0,-dis);
}
MCMF();
cout<<maxflow<<' '<<mincost<<endl;
#ifdef LOCAL
fprintf(stderr,"%f\n",1.0*clock()/CLOCKS_PER_SEC);
#endif
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探