P3381 【模板】最小费用最大流

题目描述

如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用。

输入输出格式

输入格式:

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含四个正整数ui、vi、wi、fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi。

输出格式:

一行,包含两个整数,依次为最大流量和在最大流量情况下的最小费用。

输入输出样例

输入样例#1:

4 5 4 3
4 2 30 2
4 3 20 3
2 3 20 1
2 1 30 9
1 3 40 5
输出样例#1:

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 【模板】最小费用最大流的更多相关文章

  1. P3381 [模板] 最小费用最大流

    EK  + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...

  2. 【洛谷 p3381】模板-最小费用最大流(图论)

    题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...

  3. 洛谷P3381 (最小费用最大流模板)

    记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...

  4. 洛谷.3381.[模板]最小费用最大流(zkw)

    题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...

  5. 洛谷P3381 最小费用最大流模板

    https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...

  6. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

  7. P3381 【模板】最小费用最大流(MCMF)

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N ...

  8. 洛谷P3381 - 【模板】最小费用最大流

    原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...

  9. Luogu P3381 (模板题) 最小费用最大流

    <题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...

随机推荐

  1. HTTPS时代全面到来,你准备好了吗?

    近一年可能有很多朋友发现在使用百度搜索时,是这个样子的 如我们所见,浏览器地址栏里的HTTP可能将成为永远的过去时,取而代之的是更安全的HTTPS. 首先,HTTPS是什么? HTTPS是Http O ...

  2. TextView 字数限制

    给大家推荐一个  无bug的 字数限制   http://blog.csdn.net/u012460084/article/details/50377928

  3. 安卓--selector简单使用

    selector ---选择器 在App的使用中经常能看到selector的身影 如:一个按键看上去白色或者其它颜色,可能是一张图片 按下去又显示其它的颜色或者另外一张图片 这里使用shape配合使用 ...

  4. C#复习②

    C#复习② 2016年6月15日 09:08 1.C#之Symbols Identifier = (letter|'_'|'@'){letter|digit|'_'}. 需要注意: 1.Unicode ...

  5. CDC 2013 北京站手记

    受搜狐畅游的邀请,这次能够有机会参与2013中国开发者大会北京站的活动. 本次大会的主题是“游戏”和“移动”,因此上午的峰会安排了5个主讲,分别就搜索.云存储服务器.游戏媒体.移动应用和游戏渠道等多方 ...

  6. vs中不得不会的一些小技巧(1)——细说查找

    最近在改公司里面古老的asp代码,不说文件有1w个,起码也有7,8千,而且文件里面include一个嵌套一个...当某天jira平台 上出现了需要你改的bug的时候,甚至都不知道这个错误在哪个页面,更 ...

  7. SQL Server 使用游标更新数据库中的数据(使用存储过程)

    ALTER PROCEDURE [dbo].[POR_CURSOR_FOR_UPDATE] --创建存储过程 AS BEGIN SET nocount ON --忽略行数显示 DECLARE Upda ...

  8. 【hadoop】——修改hadoop FileUtil.java,解决权限检查的问题

    在Hadoop Eclipse开发环境搭建这篇文章中,第15.)中提到权限相关的异常,如下: 15/01/30 10:08:17 WARN util.NativeCodeLoader: Unable ...

  9. 安装Mysql 5.7.1

    现在安装MySQL变成了一件非常人性化的事情,因为有了MySQL-installer这个工具,它可以帮助我们全程安装MySQL.     下面我来简单介绍一下如何使用,以供新手学习:     .首先下 ...

  10. linux中send函数MSG_NOSIGNAL异常消息

    最近2周在做ineedle的国舜项目扩展,需要使用socket的tcp连接向对方发送消息,当然需求很简单,只是按照对方要求发送指定格式的消息,程序结构也非常的简单,一对多的client/server模 ...