无传送门
每个点入度和出度都小等于
1
1
1,用
S
P
F
A
SPFA
SPFA不断跑最大费用流直到最大费用小等于
0
0
0。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=205;const ll oo=1e18;
int f[maxn<<1][maxn<<1],c[maxn<<1][maxn<<1];
int n,m,u,v,w,s,t;ll sum=0;
int vis[maxn<<1],pre[maxn<<1];ll dis[maxn<<1];
inline bool SPFA(){
queue<int> Q;int now=t;
for(int i=1;i<=t;++i)
vis[i]=pre[i]=0,dis[i]=-oo;
dis[s]=0,Q.push(s),vis[s]=1;
while(!Q.empty()){
int u=Q.front();Q.pop(),vis[u]=0;
for(int v=1;v<=t;++v){
if(f[u][v]>0&&dis[v]<dis[u]+c[u][v]){
dis[v]=dis[u]+c[u][v],pre[v]=u;
if(!vis[v]) Q.push(v),vis[v]=1;
}
}
}if(dis[t]<=0) return 0;
sum-=dis[t];
while(now!=s){
--f[pre[now]][now];
++f[now][pre[now]];
now=pre[now];
}return 1;
}
int main(){
scanf("%d%d",&n,&m),s=n+n+1,t=n+n+2;
while(m--){
scanf("%d%d%d",&u,&v,&w),sum+=w;
if(w>0) f[u][v+n]=1,c[u][v+n]=w,c[n+v][u]=-w;
}for(int i=1;i<=n;++i) f[s][i]=f[i+n][t]=1;
while(SPFA());printf("%lld\n",sum);
}
本文介绍了一种使用SPFA算法不断迭代直至找到最大费用流的方法,适用于每个节点的入度和出度都不超过111的问题场景。通过C++代码实现,详细展示了如何从源点到汇点构建图,并逐步调整边的费用与流量,直至达到最优解。
1498

被折叠的 条评论
为什么被折叠?



