1.1.4.2 费用流之模板、直接应用、二分图最优匹配
1.1.1.3.2 最小割之最大权闭合图、最大密度子图2.1.1.3.3 最小割之最小权覆盖集、最大权独立集3.1.1.3.4 最小割之建图实战、费用流基本概念
4.1.1.4.2 费用流之模板、直接应用、二分图最优匹配
1.1.4.2 费用流之模板、直接应用、二分图最优匹配
费用流模板
#include<bits/stdc++.h>
using namespace std;
const int MX_N=5010,MX_M=50100;
const int INF=0x3f3f3f3f;
struct node{
int to,next;
int w,cost;
}edge[MX_M<<1];
int head[MX_N]={0},edge_cnt=0;
inline void Add(int x,int y,int w,int c){
node& it=edge[edge_cnt];
it.cost=c;it.next=head[x];it.w=w;it.to=y;
head[x]=edge_cnt++;
}
inline void add(int x,int y,int w,int c){
Add(x,y,w,c),Add(y,x,0,-c);
}
int s=0,t=MX_N-1;
int pre[MX_N]={0},lim[MX_N]={0},dist[MX_N]={0};
bool vis[MX_N]={0};
bool spfa(){
memset(lim,0,sizeof(lim));memset(dist,INF,sizeof(dist));memset(vis,0,sizeof(vis));
queue<int >qu;
qu.push(s);lim[s]=INF,vis[s]=1,dist[s]=0;
while(!qu.empty()){
int now=qu.front();qu.pop();vis[now]=0;
for(int i=head[now];~i;i=edge[i].next){
int to=edge[i].to,w=edge[i].w,cost=edge[i].cost;
if(w&&dist[to]>dist[now]+cost){
dist[to]=dist[now]+cost;
pre[to]=i;
lim[to]=min(lim[now],w);
if(!vis[to]){
qu.push(to);
vis[to]=1;
}
}
}
}
return lim[t]>0;
}
void EK(int &flow,int &cost){
flow=cost=0;
while(spfa()){
flow+=lim[t];
cost+=lim[t]*dist[t];
for(int i=t;i!=s;i=edge[pre[i]^1].to){
edge[pre[i]].w-=lim[t];
edge[pre[i]^1].w+=lim[t];
}
}
}
signed main(){
memset(head,-1,sizeof(head));
//=======================================
//=======================================
return 0;
}
费用流直接应用
2192. 运输问题 P4015
从
从第
从
先求最小费用最大流,再求最大费用最大流。
#include<bits/stdc++.h>
using namespace std;
const int MX_N=5010,MX_M=50100;
const int INF=0x3f3f3f3f;
struct node{
int next,to;
int w,c;
}edge[MX_M<<1];
int head[MX_N]={0},edge_cnt=0;
inline void Add(int x,int y,int w,int c){
node &i=edge[edge_cnt];
i.w=w,i.c=c,i.to=y,i.next=head[x];
head[x]=edge_cnt++;
}
inline void add(int x,int y,int w,int c){
Add(x,y,w,c);Add(y,x,0,-c);
}
int dist[MX_N]={0},lim[MX_N]={0},pre[MX_N]={0};
bool vis[MX_N]={0};
int s=0,t=MX_N-1;
bool spfa(){
memset(dist,INF,sizeof(dist));
memset(lim,0,sizeof(lim));
memset(vis,0,sizeof(vis));
queue<int >qu;
qu.push(s);vis[s]=1,lim[s]=INF,dist[s]=0;
while(!qu.empty()){
int now=qu.front();qu.pop();vis[now]=0;
for(int i=head[now];~i;i=edge[i].next){
int to=edge[i].to,w=edge[i].w,c=edge[i].c;
if(dist[to]>dist[now]+c&&w){
dist[to]=dist[now]+c;
lim[to]=min(lim[now],w);
pre[to]=i;
if(!vis[to]){
qu.push(to);
vis[to]=1;
}
}
}
}
return lim[t]>0;
}
void EK(int &flow,int &cost){
flow=cost=0;
while(spfa()){
flow+=lim[t];
cost+=lim[t]*dist[t];
for(int i=t;i!=s;i=edge[pre[i]^1].to){
edge[pre[i]].w-=lim[t];
edge[pre[i]^1].w+=lim[t];
}
}
}
signed main(){
memset(head,-1,sizeof(head));
//=======================================
int m,n;scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
int xi;scanf("%d",&xi);
add(s,i,xi,0);
}
for(int i=1;i<=n;i++){
int xi;scanf("%d",&xi);
add(i+m,t,xi,0);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
int xi;scanf("%d",&xi);
add(i,j+m,INF,xi);
}
}
int flow,cost;EK(flow,cost);
printf("%d\n",cost);
for(int i=0;i<edge_cnt;i++){
edge[i].c=-edge[i].c;
}
for(int i=0;i<edge_cnt;i+=2){
edge[i].w+=edge[i^1].w;
edge[i^1].w=0;
}
EK(flow,cost);
printf("%d",-cost);
//=======================================
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App