题目描述

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

输入

第一行包含四个正整数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

555555本蒟蒻还不会zkw费用流,就先贴Edmond_Karp+SPFA和Primal_Dual的代码吧。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; struct edge {
int to,cap,cost,rev;
}; typedef pair<int,int> P;
const int maxn=, maxm=, INF=0x7F7F7F7F;
int n,m;
vector <edge> G[maxn+]; edge make_edge(int to, int cap, int cost, int rev) {
edge x;
x.to=to, x.cap=cap, x.cost=cost, x.rev=rev;
return x;
} void add_edge(int from, int to, int cap, int cost) {
G[from].push_back(make_edge(to,cap,cost,G[to].size()));
G[to].push_back(make_edge(from,,-cost,G[from].size()-));
} void init(int &s, int &t) {
scanf("%d%d%d%d",&n,&m,&s,&t);
for (int i=; i<=m; i++) {
int u,v,w,f;
scanf("%d%d%d%d",&u,&v,&w,&f);
add_edge(u,v,w,f);
}
} namespace EK_SPFA {
int dis[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
bool mark[maxn+];
memset(dis,0x7F,sizeof(dis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
memset(mark,,sizeof(mark));
queue <int> q;
dis[s]=;
q.push(s);
while (!q.empty()) {
int x=q.front();
q.pop();
mark[x]=false;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&dis[x]+e.cost<dis[e.to]) {
dis[e.to]=dis[x]+e.cost;
prev[e.to]=x;
pree[e.to]=i;
if (!mark[e.to]) {
mark[e.to]=true;
q.push(e.to);
}
}
}
}
} P min_cost_max_flow(int s, int t) {
int flow=, cost=;
for(;;) {
bfs(s);
if (dis[t]==INF)
return make_pair(flow,cost);
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
flow+=d;
cost+=d*dis[t];
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
}
}
} namespace Primal_Dual {
int dis[maxn+];
int h[maxn+];
int prev[maxn+];
int pree[maxn+]; void bfs(int s) {
priority_queue <P, vector<P>, greater<P> > q;
bool vis[maxn+];
memset(vis,,sizeof(vis));
memset(dis,0x7F,sizeof(dis));
memset(prev,-,sizeof(prev));
memset(pree,-,sizeof(pree));
dis[s]=;
q.push(make_pair(,s));
while (!q.empty()) {
int val=q.top().first, x=q.top().second;
q.pop();
if (vis[x]) continue;
vis[x]=true;
for (int i=; i<G[x].size(); i++) {
edge &e=G[x][i];
if (e.cap>&&dis[x]+e.cost+h[x]-h[e.to]<dis[e.to]&&!vis[e.to]) {
dis[e.to]=dis[x]+e.cost+h[x]-h[e.to];
prev[e.to]=x;
pree[e.to]=i;
q.push(make_pair(dis[e.to],e.to));
}
}
}
} P min_cost_max_flow(int s, int t) {
int flow=, cost=;
memset(h,,sizeof(h));
for(;;) {
bfs(s);
if (dis[t]==INF)
return make_pair(flow,cost);
for (int i=; i<=n; i++)
h[i]+=dis[i];
int d=INF;
for (int i=t; prev[i]!=-; i=prev[i])
d=min(d,G[prev[i]][pree[i]].cap);
flow+=d;
cost+=d*h[t];
for (int i=t; prev[i]!=-; i=prev[i]) {
edge &e=G[prev[i]][pree[i]];
e.cap-=d;
G[e.to][e.rev].cap+=d;
}
}
}
} int main() {
int s,t;
init(s,t);
P ans=Primal_Dual::min_cost_max_flow(s,t);
printf("%d %d\n",ans.first,ans.second);
return ;
}

洛谷 P3381 【【模板】最小费用最大流】的更多相关文章

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

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

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

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

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

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

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

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

  5. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  6. 网络流_spfa最小费用最大流

    最大流: 不断搜索增广路,寻找最小的容量-流量,得到最大流量,但最大流量在有花费时不一定是最小花费. 最小费用最大流 算法思想: 采用贪心的思想,每次找到一条从源点到达汇点的花费最小的路径,增加流量, ...

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

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

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

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

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

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

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

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

随机推荐

  1. this在java中的用法

    this在java中的用法 1.使用this关键字引用成员变量 作用:解决成员变量与参数或局部变量命名冲突的问题 public class Dog { String name; public Dog( ...

  2. 44-0-STM32的CAN外设

    1.RS-485 协议主要是把 RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性: 在 RS-485 通讯网络中,节点中的串口控制器使用 RX 与 TX信号线连接到收发器上,而收发器通过差 ...

  3. 配置notepad++支持golang开发

    1 下载golang安装包和配置环境变量 到官网下载golang安装包,下载地址:https://golang.org/dl/,我选择的go1.7.windows-amd64.zip. 配置环境变量: ...

  4. BDD中数据的类型及处理方法(python)

    BDD中提供了两种数据类型,table和text,以下是数据的文档介绍,最后有我的两个小例子. 1.class behave.model.Table(headings, line=None, rows ...

  5. 关于表情的战争APP隐私政策网址

    本软件尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本软件会按照本隐私权政策的规定使用和披露您的个人信息.但本软件将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...

  6. OO第一单元表达式求导作业总结

    第一次作业 功能描述: 对输入的表达式进行求导计算和格式正误判断   思路: 一开始的想法是想写一个大正则找到一个通项式,通过这个多项式来判断WRONG FORMAT,结果发现正则写的总是不完善,会漏 ...

  7. 用php写一个99乘法表

    运行结果如下

  8. json文件常用代码

    1.json数据内容格式化处理 package com.sklm.lhb.json; public class JsonFormatTool { /** * 单位缩进字符串. */ private s ...

  9. [assembly: AssemblyVersion("1.0.1.*")] 指定版本字符串不符合所需格式 - major[.minor[.build[.revision]]]

    报如下错误, 解决方法:打开项目文件,修改 打开项目文件修改:<Deterministic>true</Deterministic> 为:<Deterministic&g ...

  10. Windows system 在python文件操作时的路径表示方法

    file_path =(r'i:\vacpy\ch10\pi_digits.txt') #将文件路径存储在变量file_path中with open (file_path) as file_objec ...