(最小费用流的入门基础题)
题目大概意思为在一个矩阵中,有n个小人和n个房子,小人每走一格花费1美元,小人只能上下左右走,且可以经过房子但不进去,为了让每个小人有自己的房子,求最小费用

首先统计每个小人去每个房子分别最少需要多少钱, 小人到房子所需费用等于两者的横坐标差的绝对值加上纵坐标差的绝对值。然后把小人与房子之间连上一条容量为1,费用为到达所需费用的值

然后套最小费用流模板即可

(其他细节我就注释在代码中)

#include <iostream>
#include <stdio.h>
#include <utility>
#include <stdlib.h>
#include <vector>
#define INF 1000000005
using namespace std;
vector<pair<int, int> > flag1;     //用于放房子的位置
vector<pair<int, int> > flag2;     //用于放小人的位置
int N, M, n, data[105][105];
struct edge
{int to, cap, coust, rev;edge(int t, int c, int s, int r){to = t; cap = c; coust = s; rev = r;}
};
vector<struct edge> ddd[205];
int dist[205];
int prev[205];
int prep[205];
char ch;
void add_edge(int i, int j, int k)
{ddd[i].push_back(edge(j, 1, k, ddd[j].size()));ddd[j].push_back(edge(i, 0, -k, ddd[i].size() - 1));
}
int min_coust(int from, int to, int flow)
{int money = 0;while(flow--){fill(dist, dist + 2 * n + 2, INF);dist[from] = 0;bool flag = true;while(flag){flag = false;for(int i = 0; i <= 2 * n + 1; i++){if(dist[i] != INF){for(int j = 0; j < ddd[i].size(); j++){struct edge e = ddd[i][j];if(e.cap != 0 && dist[i] + e.coust < dist[e.to]){flag = true;dist[e.to] = dist[i] + e.coust;prev[e.to] = i;prep[e.to] = j;}}}}}for(int i = to; i != from; i = prev[i]){ddd[prev[i]][prep[i]].cap--;ddd[i][ddd[prev[i]][prep[i]].rev].cap++;}money = money + dist[to];}return money;
}
int main()
{while(1){flag1.clear();flag2.clear();for(int i = 0; i < 205; i++){ddd[i].clear();}scanf("%d %d", &N, &M);if(N == 0 && M == 0){break;}for(int i = 0; i < N; i++){getchar();for(int j = 0; j < M; j++){scanf("%c", &ch);if(ch == 'H'){data[i][j] = 2;flag1.push_back(make_pair(i, j));}else if(ch == 'm'){data[i][j] = 1;flag2.push_back(make_pair(i, j));}else{data[i][j] = 0;}}}n = flag1.size();for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){int num = abs(flag1[i].first - flag2[j].first) + abs(flag1[i].second - flag2[j].second);add_edge(i + 1, j + n + 1, num);}add_edge(0, i + 1, 0);add_edge(i + n + 1, 2 * n + 1, 0);}printf("%d\n", min_coust(0, 2 * n + 1, n));}
}

poj2195(最小费用流)相关推荐

  1. km算法c语言,KM算法最好的讲解+POJ2195[KM算法+最小费用流]

    二.KM算法: 二分图最优匹配:对于二分图的每条边都有一个权(非负),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最优完备匹配.(特殊的,当所有边的权为1时,就是最大完备匹配问题) 解二分图最 ...

  2. poj3686(最小费用流)

    题目大概意思为有N个玩具,M个工厂,每个工厂一次只能生产一个玩具,顺序任意,求所有玩具的加工完的平均时间最小值 例:N = 3 M = 2 Z = {{1,100},{100,1},{1,100}} ...

  3. poj3680(最小费用流 + 拆点)

    (又是一道简单的最小费用流的题目) 题目大概意思为有N个带权的开区间,现在从中选取一些区间,使任意点都不能被超过k个区间覆盖,求最大权重和 首先我们求得是最大的权重和,所以我们把 权重 ,看为 -权重 ...

  4. poj3422(最小费用流 + 拆点)

    题目大概意思为有一个N × N矩阵,每个格子里都有一个非负数,一辆车从左上方的网格移动到右下方的网格k次(车只向右或向下移动).每次访问格子后,其替换为0,且将其加入到金额中.求第k次旅行后能得到的最 ...

  5. poj3068(最小费用流)

    (和poj2135很像很像,就多了一个情况而已,基础入门题) 题目大概意思为总共有N个仓库,求两条不同路径从起点到达终点,若是没有两条,打出Not possible,若是有可能打出所需最小费用 很简单 ...

  6. HDU 5988 最小费用流

    链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意: n个点,每个点有a个人和b包饭,m条边,第一次经过这条边没有问题,以后每一个经 ...

  7. 【转载】网络流和最小费用流

    这段时间复习了下网络流模型,感觉比以前的理解有了长足进展,虽然我知道这东西难就难在建模上,而它的算法本身其实难度不大,但我还是决定说一些我的理解,毕竟理解了本质的东西运用起来才会更灵活. 最大流的求解 ...

  8. 一般图带权多重匹配(欧拉图+最小费用流)

    problem 给定 nnn 个数 {ai}\{a_i\}{ai​},其中 kkk 个 aia_iai​ 是奇数,再给一个 n×nn\times nn×n 的矩阵 {ci,j}\{c_{i,j}\}{ ...

  9. hdu3526(最小费用流)

    Description Xiao A isbecoming more and more unsatisfied with his computer since he is learninghacker ...

最新文章

  1. Nature子刊:利用转细菌基因植物修复土壤有毒污染物!
  2. 四十六、文件系统的层次结构
  3. 办公族的健康提醒脚本
  4. jQuery使用总结 - Core jQuery Selectors 选择器一2/4
  5. android域账号认证失败,绕过域账户认证失败锁定次数限制的技巧
  6. E - Olympic Medal CodeForces - 215B(数学 思维)
  7. 【IT笔试面试题整理】给定二叉树,给每层生成一个链表
  8. tiny4412u-boot烧写及根文件系统制作(不进入终端问题)
  9. 数据结构算法模拟系统
  10. Virtualbox中win7虚拟机中U盘不可用问题的解决
  11. 工程中DSP代码片断
  12. 12.2日,第二次团队冲刺开始
  13. C#字符串来袭——因为爱,所以爱
  14. freeMarker(十二)——模板语言补充知识
  15. 【Android游戏开发之四】Android 游戏框架(一个游戏角色在屏幕行走的demo)
  16. JavaWeb书城项目(尚硅谷视频整理自用)
  17. DOS windows PE三者有什么区别
  18. Blekko推出类Flipboard社交新闻网站ROCKZi
  19. 【JS】用JS实现系统常见日周月时间按钮切换效果
  20. mysql 双活_Mysql双活方案

热门文章

  1. MySQL删除表及删除表数据操作
  2. OkHttp源码分析
  3. DotNetBar12.1新控件——TokenEditor
  4. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第二弹)
  5. Linq之延迟加载特性
  6. 坚持的力量 第十五篇
  7. linux下安装oracle 10g
  8. python 给字典排序
  9. byte数组截取_Go解密:数组、切片
  10. 爬虫实战--爬取1000位小姐姐照片,刷新你三观颜值!