最小费用最大流板子,没有压行。利用重标号让边权非负,用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增广)的更多相关文章

  1. 【Luogu】P3381最小费用最大流模板(SPFA找增广路)

    题目链接 哈  学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...

  2. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  3. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

  4. 经典贪心算法(哈夫曼算法,Dijstra单源最短路径算法,最小费用最大流)

    哈夫曼编码与哈夫曼算法 哈弗曼编码的目的是,如何用更短的bit来编码数据. 通过变长编码压缩编码长度.我们知道普通的编码都是定长的,比如常用的ASCII编码,每个字符都是8个bit.但在很多情况下,数 ...

  5. POJ 2135 最小费用最大流 入门题

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7441 Descri ...

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

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

  7. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  8. POJ 2195:Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

  9. 最小费用最大流 POJ2195-Going Home

    网络流相关知识参考: http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 出处:優YoU http://blog.csdn. ...

随机推荐

  1. 把PDF的底色改成护眼色,这样读起文章来就不是很累了······

    PDF格式背景改变方法如下: 打开PDF 点击 编辑 ->首选项->辅助工具->选中"替换文档颜色"和" 自定义颜色"->将背景颜色改成 ...

  2. 一种开发模式:ajax + ashx + UserControl

    一.ajax+ashx模式的缺点     在web开发过程中,为了提高网站的用户体验,或多或少都会用到ajax技术,甚至有的网站全部采用ajax来实现,大量使用ajax在增强用户体验的同时会带来一些负 ...

  3. GridView详细介绍

    GridView控件的属性 表10.6 GridView控件的行为属性属性描述AllowPaging指示该控件是否支持分页.AllowSorting指示该控件是否支持排序.AutoGenerateCo ...

  4. C#开发微信门户及应用(20)-微信企业号的菜单管理

    前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...

  5. Error:Execution failed for task ':app:clean'.

    运行时出现 Error:Execution failed for task ':app:clean'. 错误,Builld->Clean Project即可.

  6. .Net 搭建 RESTful

    1.新建项目 ---> 选择 web 应用程序 选择 webApi 2. 创建一个httpmodeule类 放到app_data文件夹下 public class MyHttpModule : ...

  7. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  8. 2015 Autodesk 开发者日( DevDays)和 助力开发周火热报名中

    Autodesk 软件(中国)有限公司 ADN 市场部真诚地邀请您参加我们一年一度的 "Autodesk 开发者日"(简称 DevDays),以及第一次随同开发者日举办的" ...

  9. 有主线程发送message给子线程

    通常我们在处理耗时任务时候都会通过新建线程来处理,当任务处理完后通过Handler将结果发送回主线程.比如下面示例: package com.example.testlistener; import ...

  10. nginx端口占用案例分享

    这里分享一个案例,问题的原因是反向代理使用不当. 现象 首先描述一下问题的现象.当时的问题是应用启动失败,日志里面报错显示端口占用.我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题.那么同 ...