luogu 3376 最小费用最大流 模板
类似EK算法,只是将bfs改成spfa,求最小花费。
为什么可以呢,加入1-3-7是一条路,求出一个流量为40,那么40*f[1]+40*f[2]+40*f[3],f[1]是第一条路的单位费用,f[2]是。。。
因此可以写成40*(f[1]+f[2]+f[3]),那么f[1]+f[2]+..
ek算法不管先走那条路,最后一定都是最大流maxflow,那么费用是maxflow*路径费用,因此,在保证最大流的前提下,转换成了求最小费用的问题。
即求最短路类似。
另外,为什么可以这样求最小费用最大流呢,因为ek告诉你一定是从源点到汇点有一条可行路,既然每次都要选一条,一定要选最小费用的才最优。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=100010;
int n,m,s,t,cnt,hd[maxn],dis[maxn],flow[maxn],vis[maxn],pre[maxn],last[maxn];
queue<int> q;
struct Edge{
int to,nxt,flow,dis;
}edge[maxn];
void add(int u,int v,int w,int dis)
{
cnt++;
edge[cnt].to=v;
edge[cnt].nxt=hd[u];
edge[cnt].flow=w;
edge[cnt].dis=dis;
hd[u]=cnt;
}
int spfa(int s,int t)
{
memset(dis,0x7f,sizeof dis);
memset(flow,0x7f,sizeof flow);
memset(vis,0,sizeof vis);
// while(!q.empty()) q.pop();
q.push(s),vis[s]=1,dis[s]=0,pre[t]=-1; while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=hd[u];i!=-1;i=edge[i].nxt)
{
int v=edge[i].to;
if(edge[i].flow >0 && dis[v]>dis[u]+edge[i].dis)
{
dis[v]=dis[u]+edge[i].dis;
pre[v]=u;
last[v]=i;//
flow[v]=min(flow[u],edge[i].flow);//
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
// if(v==t) return 1;//已经到达,但不一定是最短路,晕,哈哈想成之前的bfs了。。。
}
}
}
// return 0;
return pre[t]!=-1;
}
int mxflow=0,mincost=0;
void mcmf()
{
while(spfa(s,t))//往下走就一定能到达
{
int now=t;
mxflow+=flow[t];
mincost+=flow[t]*dis[t];
while(now!=s)
{
edge[last[now]].flow-=flow[t];
edge[last[now]^1].flow+=flow[t];
now=pre[now];
}
}
}
int x,y,z,f;
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
memset(hd,-1,sizeof hd);cnt=-1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&z,&f);
add(x,y,z,f);
add(y,x,0,-f);//顺着流一单位,逆着流一单位,相当于没流
}
mcmf();
printf("%d %d",mxflow,mincost);
}
luogu 3376 最小费用最大流 模板的更多相关文章
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
- 图论算法-最小费用最大流模板【EK;Dinic】
图论算法-最小费用最大流模板[EK;Dinic] EK模板 const int inf=1000000000; int n,m,s,t; struct node{int v,w,c;}; vector ...
- HDU3376 最小费用最大流 模板2
Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)To ...
- 最大流 && 最小费用最大流模板
模板从 这里 搬运,链接博客还有很多网络流题集题解参考. 最大流模板 ( 可处理重边 ) ; const int INF = 0x3f3f3f3f; struct Edge { int from ...
- 【Luogu】P3381最小费用最大流模板(SPFA找增广路)
题目链接 哈 学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...
- Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...
- 【网络流#2】hdu 1533 - 最小费用最大流模板题
最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...
- poj 2195 最小费用最大流模板
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
- POJ2135 最小费用最大流模板题
练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include ...
随机推荐
- Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1903.11012v3 [cs.LG] 19 Aug 2019 Neural Networks, 25 November 2 ...
- 使用 K8s 进行作业调度实战分享
最近在公司的数据同步项目(以下简称 ZDTP)中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度. 在 ZDTP 中,数据同步的动作可抽象成 ...
- 深入探究.Net Core Configuration读取配置的优先级
前言 在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理,也.Net Core Configuration Etcd数据源 ...
- java生成四位随机数,包含数字和字母 区分大小写,特别适合做验证码,android开发
private String generateWord() { String[] beforeShuffle = new String[] { "2", "3" ...
- 02.Flink的单机wordcount、集群安装
一.单机安装 1.准备安装包 将源码编译出的安装包拷贝出来(编译请参照上一篇01.Flink笔记-编译.部署)或者在Flink官网下载bin包 2.配置 前置:jdk1.8+ 修改配置文件flink- ...
- javaScript 推荐书籍 由简单到入门,初级到高级。
- 关于babel你需要知道的事情
babel js转码器 ES6 ==> ES5 配置 .babelrc
- adb 打开手机端口进行无线模式调试
打开手机端口 让手机在指定的端口可以接收到TCP/IP连接. 确保手机开启了usb调试 用usb线把手机和电脑连接起来 执行命令:adb tcpip 5555 执行成功后就可以把usb线拔掉了,端口可 ...
- openssl1.0在mac下的编译安装(踩坑精华)
之前做了一次brew版本升级,然后用pip3安装的一个python命令就无法执行了(涉及到openssl库),执行就会报一个错误. ImportError: dlopen(/usr/local/Cel ...
- Codeforces Round #560 (Div. 3)A-E
A. Remainder output standard output You are given a huge decimal number consisting of nn digits. It ...