[板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行。利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多。教程略去。转载请随意。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <queue>
using namespace std;
;
const int inf = 0x33333333;
typedef pair<int, int> int2;
struct edge {
int to, rev, cap, cost;
};
int n;
vector<edge> G[maxn];
void add_edge(int u, int v, int cap, int cost) {
G[u].push_back((edge){v, (int)G[v].size(), cap, cost});
G[v].push_back((edge){u, (, , -cost});
}
int2 mcmf(int s, int t) {
//init
static int h[maxn]; //标号
, cost = ;
//solve
while(true) {
//dijkstra init
static int dist[maxn]; //距离
static int pv[maxn]; //上一个顶点
static int pe[maxn]; //上一条弧
memset(dist, 0x33, sizeof dist);
dist[s] = ;
priority_queue< int2, vector<int2>, greater<int2> > q;
q.push(int2(, s));
//dijkstra
while(!q.empty()) {
int2 x = q.top();
q.pop();
int u = x.second;
if(x.first != dist[u]) {
continue;
}
if(u == t) {
break;
}
; i < (int)G[u].size(); ++i) {
edge &e = G[u][i];
int newcost = e.cost + h[u] - h[e.to];
&& dist[e.to] > dist[u] + newcost) {
dist[e.to] = dist[u] + newcost;
q.push(int2(dist[e.to], e.to));
pv[e.to] = u;
pe[e.to] = i;
}
}
}
if(dist[t] == inf) {
break;
}
//augment
; i < n; ++i) {
h[i] = min(h[i] + dist[i], inf);
}
int newflow = inf;
for(int x = t; x != s; x = pv[x]) {
edge &e = G[pv[x]][pe[x]];
newflow = min(newflow, e.cap);
}
flow += newflow;
cost += newflow * h[t];
for(int x = t; x != s; x = pv[x]) {
edge &e = G[pv[x]][pe[x]];
e.cap -= newflow;
G[x][e.rev].cap += newflow;
}
}
return make_pair(flow, cost);
}
int main(void) {
int m, source, sink;
scanf("%d%d%d%d", &n, &m, &source, &sink), --source, --sink;
; i < m; ++i) {
int u, v, cap, cost;
scanf("%d%d%d%d", &u, &v, &cap, &cost), --u, --v;
add_edge(u, v, cap, cost);
}
int2 ans = mcmf(source, sink);
printf("%d %d\n", ans.first, ans.second);
;
}
[板子]最小费用最大流(Dijkstra增广)的更多相关文章
- 【Luogu】P3381最小费用最大流模板(SPFA找增广路)
题目链接 哈 学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
- 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)
哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...
- POJ 2135 最小费用最大流 入门题
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19207 Accepted: 7441 Descri ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)
将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...
- POJ 2195:Going Home(最小费用最大流)
http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...
- 最小费用最大流 POJ2195-Going Home
网络流相关知识参考: http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 出处:優YoU http://blog.csdn. ...
随机推荐
- 把PDF的底色改成护眼色,这样读起文章来就不是很累了······
PDF格式背景改变方法如下: 打开PDF 点击 编辑 ->首选项->辅助工具->选中"替换文档颜色"和" 自定义颜色"->将背景颜色改成 ...
- 一种开发模式:ajax + ashx + UserControl
一.ajax+ashx模式的缺点 在web开发过程中,为了提高网站的用户体验,或多或少都会用到ajax技术,甚至有的网站全部采用ajax来实现,大量使用ajax在增强用户体验的同时会带来一些负 ...
- GridView详细介绍
GridView控件的属性 表10.6 GridView控件的行为属性属性描述AllowPaging指示该控件是否支持分页.AllowSorting指示该控件是否支持排序.AutoGenerateCo ...
- C#开发微信门户及应用(20)-微信企业号的菜单管理
前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...
- Error:Execution failed for task ':app:clean'.
运行时出现 Error:Execution failed for task ':app:clean'. 错误,Builld->Clean Project即可.
- .Net 搭建 RESTful
1.新建项目 ---> 选择 web 应用程序 选择 webApi 2. 创建一个httpmodeule类 放到app_data文件夹下 public class MyHttpModule : ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中
Autodesk 软件(中国)有限公司 ADN 市场部真诚地邀请您参加我们一年一度的 "Autodesk 开发者日"(简称 DevDays),以及第一次随同开发者日举办的" ...
- 有主线程发送message给子线程
通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程.比如下面示例: package com.example.testlistener; import ...
- nginx端口占用案例分享
这里分享一个案例,问题的原因是反向代理使用不当. 现象 首先描述一下问题的现象.当时的问题是应用启动失败,日志里面报错显示端口占用.我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题.那么同 ...