最小费用最大流板子,没有压行。利用重标号让边权非负,用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. 怎样写一个webpack loader

    div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...

  2. React Native图片控件的使用

    首先定义组件 import { AppRegistry, StyleSheet, Text, View, Image,} from 'react-native'; 然后将render返回中的模版增加I ...

  3. C# 本质论 第四章 方法和参数

    要为方法名使用动词或动词短语 递归:递归调用方法 方法重载: try catch

  4. 【无私分享:ASP.NET CORE 项目实战(第五章)】Repository仓储 UnitofWork

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对UnitOfWork的一些理解  UnitOfW ...

  5. Yii 2.x 日志记录器-类图

  6. GJM : Unity3D HIAR -【 快速入门 】 六、导出 iOS 工程

    导出 iOS 工程 在开始之前,请务必先保存您的工程.由于 Unity 无法直接生成 ipa 文件,您需要先导出 iOS 工程文件,然后通过 Xcode 编译生成. Step 1. 选择平台 在 Un ...

  7. jdk jre jvm 三者之间关系

    JDK JDK是java开发工具包,是Sun公司针对Java开发员的产品.     JDK 中包含JRE,在JDK安装的目录下有一个叫jre的目录,里面有两个文件夹,bin/和lib,其中bin就是j ...

  8. 网址http换成https ----js

    <script type="text/javascript"> var url = window.location.href; if (url.indexOf(&quo ...

  9. JS高程5.引用类型(2)Array类型

    Array类型: ECMAScript数组的每一项可以保存任何类型的数据,数组的大小是可以动态调整的. 创建数组的基本方式: (1)使用Array构造函数 var color=new Array(); ...

  10. javascript操作系统检测

    function detectOS() { var sUserAgent = navigator.userAgent;console.log(sUserAgent); var isWin = (nav ...