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 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
随机推荐
- c中的数据类型、常量、变量
一. 数据 1. 什么是数据 生活中时时刻刻都在跟数据打交道,比如体重数据.血压数据.股价数据等.在我们使用计算机的过程中,会接触到各种各样的数据,有文档数据.图片数据.视频数据,还有聊QQ时产生的文 ...
- win10_x64更新错误解决: 安装一些更新时出现问题,但我们稍后会重试。如果持续出现这些问题,并且你想要搜索Web或联系支持人员以获取相关信息,以下信息可能会对你有帮助:
可能的原因: 1.windows 服务没打开 win+r,打开[运行]对话框 输入 [service.msc] 找到 [Windows Firewall]和[Internet connection s ...
- jar 命令 打包装class文件的文件夹
由于将spring源代码导入到eclipse后,缺少jar包, 所以从maven仓库中下载spring发布的spring-core jar包. 为了方便理解目录结构,使用tree命令: tr ...
- CentOS vsftp安装与配置
详细配置说明:. http://www.cnblogs.com/app-lin/p/5189762.html 1.安装vsftpd yum install vsftpd 2.启动/重启/关闭vsftp ...
- ios界面布局整理
1 UIView 1.1 创建自定义的UIView的xib文件 [1]设置 file's Owner的 Custom Class 中的class 执行自定义控件类 [2]设置当前UIView 的屏幕大 ...
- iOS开发进阶
<iOS开发进阶>基本信息作者: 唐巧 出版社:电子工业出版社ISBN:9787121247453上架时间:2014-12-26出版日期:2015 年1月开本:16开页码:268版次:1- ...
- Angularjs之如何在跨域请求中传输Cookie
一般情况我们在使用WebApi之类的技术时,都会遇到跨域的问题,这个只需要在服务端做一下处理即可. 如果这些GET或POST请求不需要传递Cookie数据的话,就没什么问题了,但如果需要,那么会发现 ...
- 【转】ETL增量抽取——通过时间戳方式实现
这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...
- android JAVA字符串转日期或日期转字符串(转)
用法: SimpleDateFormat sdf = new SimpleDateFormat( " yyyy-MM-dd HH:mm:ss " ); 这一行最重要,它确立了转换的 ...
- Linux软件安装-RPM安装
RPM是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux. S ...