费用流 (最小费用最大流)

  • 网络图中 每条边 多给出了 单位流量的费用 cost(u,v) ,当通过(u,v)的流量为f(u,v)f(u,v)f(u,v)时,需要花费 f(u,v)∗cost(u,v)f(u,v)*cost(u,v)f(u,v)∗cost(u,v)

  • 因为是在 最大流的前提下求出最小费用, 那么 最大流量已经确定了,即使每条边的花费不一样,但只要费用和最小就行了


  • EK+SPFA

HDU 1533

  • 人作为一部分,房子作为一部分, 费用是坐标系下的距离,
  • 建一个源点和终点,源点和人连接,费用是0
  • 房子和终点同理
  • 所有边的流相同能够保证 人去房子的机会相等, =1便于费用计算
#include <iostream>
#include <queue>
#include <cstring>using namespace std;
const int inf = 1e9+5;
const int maxn = 1e5+5;struct Edge {int to,next,cost,c,flow;
} edge[maxn];int head[maxn],tot;
int pre[maxn],dist[maxn];
bool vis[maxn];
char ch[110][110];
int x[210],y[210];
int n,m;void addedge(int u,int v,int c,int cost) {edge[tot].to = v; edge[tot].c = c;edge[tot].cost = cost; edge[tot].flow = 0;edge[tot].next = head[u]; head[u] = tot++;edge[tot].to = u; edge[tot].c = 0;edge[tot].cost = -cost; edge[tot].flow = 0;edge[tot].next = head[v]; head[v] = tot++;
}bool spfa(int source,int sink) {queue<int> que;/* for (int i=0; i<=sink; ++i) {*///dist[i] = inf;//vis[i]  = false;//pre[i]  = -1;/*}*/memset(dist,inf,sizeof dist);memset(vis,0,sizeof vis);memset(pre,-1,sizeof pre);dist[source] = 0;vis[source]  = 1;que.push(source);while (!que.empty()) {int cur = que.front(); que.pop();vis[cur] = false;for (int i=head[cur]; i!=-1; i=edge[i].next) {int v=edge[i].to;if (edge[i].c>edge[i].flow && dist[v]>dist[cur]+edge[i].cost) {dist[v] = dist[cur] + edge[i].cost;pre[v] = i; //点v的入边if (!vis[v]) {vis[v] = 1;que.push(v);}}}}if (pre[sink] == -1) return false;return true;
}void Dinic(int source,int sink,int &cost) {cost = 0;while (spfa(source,sink)) {int delta = inf;int i = pre[sink];while (i != -1) {delta = min(delta,edge[i].c - edge[i].flow);i = pre[edge[i^1].to];}i = pre[sink];while (i != -1) {edge[i].flow += delta;edge[i^1].flow -= delta;cost += edge[i].cost * delta; // 已知流量一定是1,delta 可以无i = pre[edge[i^1].to];}}
}int main() {while (scanf("%d%d",&n,&m) && (n+m)) {for (int i=0; i<n; ++i)scanf("%s",ch[i]);int num=0;for (int i=0; i<n; ++i)for (int j=0; j<m; ++j)if (ch[i][j] == 'm') {++num;x[num] = i;y[num] = j;}int cnt = 0;for (int i=0; i<n; ++i)for (int j=0; j<m; ++j)if (ch[i][j] == 'H') {++cnt;x[num+cnt] = i;y[num+cnt] = j;}int source=0,sink=num+cnt+1;memset(head,-1,sizeof head);tot = 0;for (int i=1; i<=num; ++i)addedge(source,i,1,0);for (int i=num+1; i<=num+cnt; ++i)addedge(i,sink,1,0);for (int i=1; i<=num; ++i)for (int j=1; j<=cnt; ++j) {int u = i,v = num+j;int c = abs(x[u]-x[v]) + abs(y[u] - y[v]);addedge(u,v,1,c);}//cout << "yes" <<endl;int cost;Dinic(source,sink,cost);//cout << "no" <<endl;printf("%d\n",cost);}return 0;
}

HDU 1533 费用流入门相关推荐

  1. hdu 3395(费用流,二分图的最大权匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 解题思路: 这个构图很容易出错,最开始都容易想,把每个点拆开,分为攻击和被攻击的,建图如下: 源 ...

  2. hdu 5045 费用流

    题意:      网选赛的一个题目,当时各种超时各种wa,哎! 题意是有n个人m道题,每个人对每道题都有一个ac率,每相邻的n到题目必须n个人每人一道,顺序无所谓,上下的m%n道只要不出现一个人做两道 ...

  3. Random Maze HDU - 4067 费用流/可行流

    主要谈谈建图的原理给自己听 首先贪心出来的一个图上加的边都是可走的[修改边],这些修改边的反向边是用来在跑网络流的时候撤销修改的 换句话说,每条修改边都是备选项,是用来调整图上各点入度的 所以,既然是 ...

  4. HDU - 4780费用流

    题意:M台机器要生产n个糖果,糖果i的生产区间在(si, ti),花费是k(pi-si),pi是实际开始生产的时间机器,j从初始化到生产糖果i所需的时间Cij,花费是Dij,任意机器从生产糖果i到生产 ...

  5. HDU Problem - 1533 Going Home(费用流板子题)

    题目链接 Problem Description On a grid map there are n little men and n houses. In each unit time, every ...

  6. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  7. hdu 2448 Mining Station on the Sea(最短路+费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个 ...

  8. HDU 5383 Yu-Gi-Oh!(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5383 题意:游戏王同调召唤的方法,每只怪兽有等级和攻击力,两种不同类型的怪兽可以在一定限制下召唤出某一 ...

  9. HDU 4833 Best Financing 一脸费用流的dp

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=4833 题意:中文题不解释... 解题思路: 首先以interest_rates为费用建图跑费用流是比较容易 ...

最新文章

  1. Linux下使用nmap扫描局域网存活的IP
  2. java实现十进制与二进制之间的转换
  3. sql2008 查询某个表被那些存储过程用到
  4. Android 可视化界面编辑器无法显示界面问题的终极解决方案
  5. springboot+mybatis集成自定义缓存ehcache用法笔记
  6. 【无码专区7】括号序列(思维)
  7. 使用ViewContainerRef探索Angular DOM操作技术
  8. LeetCode 47 全排列 II
  9. 23.网市场云建站系统部署
  10. Spring beans配置方案(一) 学习笔记
  11. HashSet和HashMap的区别 1
  12. .net知识和学习方法系列(二十三)嵌套类
  13. 计算机显示器刷新率怎么调,显示器刷新率怎么超频?电脑显示器提高屏幕刷新率超频教程...
  14. 《生物信息学》阅读笔记 (一):生物信息学的概念及发展历史
  15. 卸载计算机安全证书,卸载https证书详细的步骤有哪些
  16. 闲谈绩效考核——来自项目管理群的讨论
  17. PHP距离高考还剩多少天,今天距离2022年高考还有多少天
  18. UVA - 1645 - Count(思路)
  19. 新建好的网站如何被搜索引擎(Google和百度)收录?
  20. 【kimol君的无聊小发明】—用python写截屏小工具

热门文章

  1. 在一家 IT 公司工作 10 年是一种怎样的体验?
  2. 基于JAVA迅腾游戏交流网站计算机毕业设计源码+系统+lw文档+部署
  3. leetcode 面试题62. 圆圈中最后剩下的数字
  4. 四川计算机二级时间安排,2020年9月四川计算机二级考试时间
  5. 全球及中国无线电测试测量行业细分产品市场规模发展趋势分析及竞争战略格局研究预测
  6. python下载迅雷资源助手_python:you-get下载B站、优酷网站的在线视频
  7. 纯css实现一个族谱树
  8. 简单的GridView分业,后台不需要写
  9. OBS 增加人脸特效插件
  10. Educode--头歌 《软件工程》实验作业8-需求分析