博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大流最小费用(模板)
阅读量:5933 次
发布时间:2019-06-19

本文共 1782 字,大约阅读时间需要 5 分钟。

在最大流上加了一个费用

用EK的方法先用spfa找最小费用的一个可行流,在一次次修改,与最大流思想一样,不过找最短路时需要建一个负边

#include
#include
#include
#include
using namespace std;const int M=199999;int n,m,s,t;int dis[M];;int nex[M],head[M],cos[M],to[M],tot,pre[M],cap[M],vis[M],flo[M],id[M];int add(int x,int y,int z,int w){ cos[tot]=z; cap[tot]=w; nex[++tot]=head[x]; to[tot]=y; head[x]=tot;}int spfa(int s,int t){ queue
q; memset(dis,127,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(pre,-1,sizeof(pre)); int INF=dis[0]; dis[s]=0; vis[s]=1; q.push(s); flo[s]=INF; while(!q.empty()){ int x=q.front(); vis[x]=0; q.pop(); for(int i=head[x];i;i=nex[i]) { int tmp=to[i]; if(dis[tmp]>dis[x]+cos[i-1]&&cap[i-1]){ dis[tmp]=dis[x]+cos[i-1]; pre[tmp]=x; flo[tmp]=min(flo[x],cap[i-1]); id[tmp]=i-1; if(!vis[tmp]){ q.push(tmp); vis[tmp]=1; } } } } if(dis[t]>=INF)return 0; return 1; }struct st{ int cost=0; int flow=0;}; st maxflow(int s,int t){ st a; while(spfa(s,t)){ int k=t; while(k!=s){ cap[id[k]]-=flo[t]; cap[id[k]^1]+=flo[t]; k=pre[k]; } a.flow+=flo[t]; a.cost+=flo[t]*dis[t]; } return a;}int main(){ scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;i++){ int x,y,z,w; scanf("%d%d%d%d",&x,&y,&z,&w); add(x,y,w,z); add(y,x,-w,0); } st d=maxflow(s,t); printf("%d %d",d.flow,d.cost); return 0;}

转载于:https://www.cnblogs.com/wspl98765/p/6819866.html

你可能感兴趣的文章
今夜你会不会上线
查看>>
php优化
查看>>
win7mmc远程桌面
查看>>
数据库连接池的作用及配置说明
查看>>
ip命令使用(常用)
查看>>
如何制作批处理导入注册表,同时也删除批处理
查看>>
我的友情链接
查看>>
Cacti中文版安装配置
查看>>
TCP连接优化
查看>>
Lync Server 2010的部署系列_第十八章 配置Exchange UM与Lync Server语音集成
查看>>
鸟哥的linux私房菜-shell简单学习-1
查看>>
js判断是否安装某款APP
查看>>
@Autowired与@Resource的区别
查看>>
我的友情链接
查看>>
记忆碎片
查看>>
实例演示图片上传
查看>>
使用GNS3+VMware搭建大型网络拓扑
查看>>
路由协议的防环机制
查看>>
安卓学习笔记1
查看>>
JAVA面向对象-----多态
查看>>