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 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
随机推荐
- MapReduce实例-NASA博客数据频度简单分析
环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境,gnuplot, 数据:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.htm ...
- 使用Gradle构建构建一个Java Web工程及持续集成环境Jenkins配置
安装Eclipse插件——Buildship 什么是Buildship? Buildship能方便我们通过Eclipse IDE创建和导入Gradle工程,同时还能执行Gradle任务. Eclips ...
- OSGI.NET 框架浅析
关于osgi.net ,想必大家也听说过,以下是自己在学习osgi.net 过程中整理出来的内容,供大家学习参与使用. 1. UIOSP 开放工厂框架架构 开放工厂所有插件基于OSGi.NET面向服 ...
- 从Prototype学习JavaScript面向对象编程
概述 JavaScript是一种基于对象的编程语言.它是灵活的,既有面向过程(也就是面向函数)的编程,也有面向对象的编程.因此我称它是基于对象的编程语言. 对于JavaScript的面向过程的编程特性 ...
- Oracle Data Provider for .NET
官方地址: http://www.oracle.com/technetwork/topics/dotnet/index-085163.html 终于有正式版了.不用装客户端,又小,确实好.
- windows环境下无法引用全局安装的模块问题
问题 在node项目中,往往需要安装一些依赖的包,通常我们采取全局安装的方式,来减少一些包重复安装带来的烦恼. 但是全局安装后出现无法使用的情况,可能是你NODE_PATH没有设置或者不正确造成的. ...
- Android中dip、dp、sp、pt和px的区别
1.概述 过去,程序员通常以像素为单位设计计算机用户界面.例如:图片大小为80×32像素.这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小.在有些情况 ...
- ES6块级作用域及新变量声明(let)
很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域.用var声明的变量具有变量提升(declaration hoist ...
- Javascript为元素添加事件处理函数
document.getElementById("test").onclick = function(){ ... };
- linux原始套接字(4)-构造IP_UDP
一.概述 同上一篇tcp一样,udp也是封装在ip报文里面.创建UDP的原始套接字如下: (soc ...