博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小费用最大流(MFMC 邻接表 无向边)
阅读量:5366 次
发布时间:2019-06-15

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

[困]坑点:无向边,每条边只能走一次,但正向走一次后反向还能走一次,所以每次输入要建四条边。

#include 
#include
#include
#include
#include
using namespace std;int n,m,cnt;int head[50500],vis[50500],pre[50500];long long dis[50500];struct edge{ int u,v,w,cap,next;}e[50050<<2];void Initial(){ memset(head,-1,sizeof(head));}bool SPFA(){ memset(pre,-1,sizeof(pre)); for(int i=0;i<=n+2;i++){ dis[i]=1e11; } memset(vis,0,sizeof(vis)); queue
que; vis[0]=1; que.push(0); dis[0]=0; while(!que.empty()){ int d=que.front(); que.pop(); vis[d]=0; for(int i=head[d];i!=-1;i=e[i].next){ int v=e[i].v; if(dis[v]>dis[d]+e[i].w && e[i].cap){ dis[v]=dis[d]+e[i].w; pre[v]=i; if(!vis[v]){ vis[v]=1; que.push(v); } } } } if(dis[n+1]<1e11){ return true; } return false;}int MCMF(){ int flow=0,mincost=0; while(SPFA()){ long long Minflow=1e11; int d=n+1; for(int i=pre[d];i!=-1;i=pre[e[i].u]){ Minflow=min(Minflow,(long long)e[i].cap); } flow+=Minflow; for(int i=pre[d];i!=-1;i=pre[e[i].u]){ e[i].cap-=Minflow; e[i^1].cap+=Minflow; } mincost+=dis[d]; } return mincost;}void add(int u,int v, int cap,int w){ e[cnt].u=u; e[cnt].v=v; e[cnt].w=w; e[cnt].cap=cap; e[cnt].next=head[e[cnt].u]; head[u]=cnt++; e[cnt].v=u; e[cnt].u=v; e[cnt].w=-1*w; e[cnt].cap=0; e[cnt].next=head[e[cnt].u]; head[v]=cnt++;}int main(){ while(~scanf("%d%d",&n,&m)){ cnt=0; Initial(); for(int i=0;i

 

转载于:https://www.cnblogs.com/Scale-the-heights/p/4388627.html

你可能感兴趣的文章
ASP.NET应用程序与页面生命周期
查看>>
Linux--多网卡的7种Bond模式
查看>>
Oracle命令(一):Oracle登录命令
查看>>
业务建模 之 业务用例图
查看>>
EasyUI基础入门之Pagination(分页)
查看>>
一次PHP代码上线遇到的问题
查看>>
显示密码
查看>>
实现one hot encode独热编码的两种方法
查看>>
ubuntu中文英文环境切换
查看>>
[sql]mysql启停脚本
查看>>
[elk]Mutate filter plugin增删改查字段
查看>>
Java内功心法,行为型设计模式
查看>>
向github项目push代码后,Jenkins实现其自动构建
查看>>
jquery中的ajax方法参数的用法和他的含义
查看>>
BZOJ 1226: [SDOI2009]学校食堂Dining
查看>>
数组去重的几种方法
查看>>
包装类的自动装箱与拆箱
查看>>
ShareSDk的使用
查看>>
android使用web加载网页的js问题
查看>>
libvirt log系统分析
查看>>