P3381 【模板】最小费用最大流
P3381 【模板】最小费用最大流
题目描述
如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。
输入输出格式
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。
输出格式:
一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。
输入输出样例
4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
50 280
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=10
对于70%的数据:N<=1000,M<=1000
对于100%的数据:N<=5000,M<=50000
样例说明:

如图,最优方案如下:
第一条流为4-->3,流量为20,费用为3*20=60。
第二条流为4-->2-->3,流量为20,费用为(2+1)*20=60。
第三条流为4-->2-->1-->3,流量为10,费用为(2+9+5)*10=160。
故最大流量为50,在此状况下最小费用为60+60+160=280。
故输出50 280。
90分的MCMF(dijkstra被卡常数了)
#include<cstdio>
#include<cstring>
#include<queue>
#define pir pair<int,int>
#define inf 0x33333333
using namespace std;
const int N=1e4+;
const int M=1e5+;
struct node{
int v,next,cap,cost;
node(int v=,int next=,int cap=,int cost=):v(v),next(next),cap(cap),cost(cost){}
}e[M<<];int tot=;
int n,m,S,T,head[N],pv[N],pe[N],dis[N],h[N];
bool vis[N];
void add(int x,int y,int cap,int cost){
e[++tot]=node(y,head[x],cap,cost);
head[x]=tot;
}
pir MCMF(){
int flow=,cost=;
while(){
memset(dis,0x33,sizeof dis);
priority_queue<pir,vector<pir>,greater<pir> >q;
q.push(make_pair(dis[S]=,S));
while(!q.empty()){
pir t=q.top();q.pop();
int x=t.second;
if(t.first!=dis[x]) continue;
if(x==T) break;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v,newcost=e[i].cost+h[x]-h[v];
if(e[i].cap>&&dis[v]>dis[x]+newcost){
dis[v]=dis[x]+newcost;
q.push(make_pair(dis[v],v));
pv[v]=x;pe[v]=i;
}
}
}
if(dis[T]==inf) break;
for(int i=;i<=n;i++) h[i]=min(h[i]+dis[i],inf);
int newflow=inf;
for(int i=T;i!=S;i=pv[i]){
newflow=min(newflow,e[pe[i]].cap);
}
flow+=newflow;
cost+=newflow*h[T];
for(int i=T;i!=S;i=pv[i]){
e[pe[i]].cap-=newflow;
e[pe[i]^].cap+=newflow;
}
}
return make_pair(flow,cost);
}
int main(){
scanf("%d%d%d%d",&n,&m,&S,&T);
for(int i=,x,y,z,w;i<=m;i++) scanf("%d%d%d%d",&x,&y,&z,&w),add(x,y,z,w),add(y,x,,-w);
pir ans=MCMF();
printf("%d %d",ans.first,ans.second);
return ;
}
100分(改成spfa就过了)
/*
以费用作为权值,求出最小费用链,然后在这条链上求得一个最小流量,直到找不到费用链。求最小费用链也就相当于求src->des的最短路径。
使用spfa+EK算法。得到MCMF算法
*/ #include<cstdio>
#include<cstring>
#include<iostream>
#define inf 0x7fffffff
using namespace std;
const int N=1e4+;
const int M=1e5+;
struct node{
int v,next,cap,cost;
}e[M*];int tot=;
int n,m,S,T,head[N],dis[N],flow[N],pree[N],q[M*];
int Flow,Cost;
bool vis[N];
void add(int x,int y,int a,int b){
e[++tot].v=y;e[tot].cap=a;e[tot].cost=b;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].cap=;e[tot].cost=-b;e[tot].next=head[y];head[y]=tot;
}
bool spfa(){
for(int i=;i<=n;i++) vis[i]=,dis[i]=inf;
int h=,t=;dis[S]=;q[t]=S;flow[S]=inf;pree[S]=;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v;
if(e[i].cap&&dis[v]>dis[x]+e[i].cost){
dis[v]=dis[x]+e[i].cost;
pree[v]=i;
flow[v]=min(flow[x],e[i].cap);
if(!vis[v]){
vis[v]=;
q[++t]=v;
}
}
}
}
return dis[T]<inf;
}
void agument(){
for(int i=T;i!=S;i=e[pree[i]^].v){
e[pree[i]].cap-=flow[T];
e[pree[i]^].cap+=flow[T];
}
Flow+=flow[T];
Cost+=flow[T]*dis[T];
}
void MCMF(){
while(spfa()) agument();
}
int main(){
scanf("%d%d%d%d",&n,&m,&S,&T);
for(int i=,x,y,z,w;i<=m;i++) scanf("%d%d%d%d",&x,&y,&z,&w),add(x,y,z,w);
MCMF();
printf("%d %d\n",Flow,Cost);
return ;
}
P3381 【模板】最小费用最大流的更多相关文章
- P3381 [模板] 最小费用最大流
EK + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...
- 【洛谷 p3381】模板-最小费用最大流(图论)
题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...
- 洛谷P3381 (最小费用最大流模板)
记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...
- 洛谷.3381.[模板]最小费用最大流(zkw)
题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- P3381 【模板】最小费用最大流(MCMF)
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
随机推荐
- Loader加载器
今天学到了这个Loader,浅谈一下自己的看法: 1.定义 Loader是一个加载器,可以用来它访问数据,可以看做访问数据的机器(好比挖掘机).装再器从android3.0开始引进,它使得在activ ...
- [Android] android studio 2.0即时运行功能探秘
即时运行instant Run是android studio 2中,开发人员最关心的特性之一 在google发布studio 2.0之后,马上更新体验了一把,然而发现,并没快多少,说好的即时运行呢? ...
- 关于NodeJS的思考
对于NodeJS来说传统程序员比较陌生,初看以为是什么前端框架,其实并不是前端框架.传统的Javascript只能跑在浏览器中,但是一位叫Ryan Dahl的开发者灵感一来,为什么Javascript ...
- Nexus Repository Manager 3.0 发布
著名仓库管理工具Nexus,在2016年4月6日发布3.0版本(包括OSS版),相较2.*版本有很大的改变: 1. 从底层重构,从而提高性能,增强扩展能力,并改善用户体验 2. 升级界面,增加更多的浏 ...
- git代码库误操作还原记录
先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...
- 面试问题-使用Java线程做数学运算
这是一个展示如何使用join()方法的例子. 问题: 使用Java多线程计算表达式1*2/(1+2)的值. 解决方案: 使用一个线程做加法运算,另一个线程做乘法运算,还有一个主线程main做除法运算. ...
- apache https配置
1. 确认是否安装ssl模块 是否有mod_ssl.so文件 2. 生成证书和密钥 linux下 步骤1:生成密钥 命令:openssl genrsa 1024 > server.key 说 ...
- 通过HostOnly Cookie为Cookie正确的设置一级域名
前言 用户行为分析,最重要的一点就是通过埋点准确的获取用户的Cookie,那么这个Cookie到底怎么设置呢?那么如果面对的是站群,用户Cookie又该怎么设置,才能让访客量和新访客量准确无误呢? 接 ...
- 模块module
python中的Module相当于C++中头文件和命名空间的组合体,便于代码的组织,任何一个python代码的文件都是一个Module,都可以被其他模块import import,from...imp ...
- 高仿一元云购IOS应用源码项目
高仿一元云购IOS应用(高仿自一元云购安卓客户端) 本App因官方没有IOS客户端故开发,利用业务时间历时2个星期,终于开发完成,又因苹果的各大审核规则对此App的影响,又历时1个多月才终于成功上架, ...