题目大意:在一个网格里面有n个小男人和n个房子,现在想让每个小男人都有一个房子住,不过每个人移动一下都需要花费¥1,现在求出来最小的总花费。ps:可以认为网格的每个点都是很大的广场并且容纳所有的人,人可以走在有房子的点但是不进入房子。

分析:人-房子,很完美的带全都最小值匹配啊,人到一个房子的花费就是他们之间的曼哈顿距离,用这些距离构造一个二分图,然后用KM算法求出来最小费。下面是KM算法
***********************************************************************************************************************************
#include<stdio.h>
#include<;
;

;

; i<MAXN; i++)
    {
        dx[i] = -oo;
        dy[i] = ;
    }

}
; j<=Ny; j++)
    {
        , ; i<=Nx; i++)
    {
        ; j<=Ny; j++)
            slack[j] = oo;
        ; j<=Ny; j++)
            {
                ; j<=Nx; j++)
            {
                ; j<=Ny; j++)
            {
                ;

; i<=Ny; i++)
        sum += w[Ly[i]][i];

; i<M; i++)
            scanf(; i<M; i++)
        ; j<N; j++)
        {
            ; i<=Nx; i++)
        ; j<=Ny; j++)
        {
            w[i][j] = fabs(man[i].x-house[j].x) + fabs(man[i].y-house[j].y);
            w[i][j] = -w[i][j];
            dx[i] = max(dx[i], w[i][j]);
        }

printf(;
}

研究了一下网络网络流里面的最小费用最大流,听着名字比较高大上吧,看了半天终于恍然大悟,其实还是最大流。但是为什么又叫最小费用呢?所谓的最小费用并不是从源点到汇点的最小费用,而是再保证最大流的前提下的最小费用,我们求最大流的的办法就是不断进行路径增广,而怎么增广路径就比较随意了,可以用深搜或者广搜,不管怎么样只要找到可以进行增广的路就行,如果在这个前提下我们找增广路的时候用最短路的办法去找,那么岂不是找的每条路都是花费最小的,而且最后无路时候就是最小花费了(同时也求出来了最大流),有了这个认识就可以写最消费最大流了。

下面是用spfa(可以处理负权边)实现的。
***********************************************************************************************************************************
#include<stdio.h>
#include<;
;

}, dist[MAXN];

; i<=End; i++)
        dist[i] = oo;

dist[start] = ;
    sta.push(start);

; i<=End; i++)
        {
            ;

, ;

; i<M; i++)
            scanf(; i<M; i++)
        ; j<N; j++)
        {
            ; i<=NX; i++)
        ; j<=NY; j++)
        {;
            G[i][NX+j].cost = fabs(man[i].x-house[j].x)+fabs(man[i].y-house[j].y);
            G[NX+j][i].cost = -G[i][NX+j].cost;
        }

start = NX+NY+, End = start+;

; i<=NX; i++)
        {;
            G[start][i].cost = ;
        }
        ; i<=NY; i++)
        {;
            G[NX+i][End].cost = ;
        }

printf(;
}

Going Home - poj 2195(最小费用流 | 二分匹配)的更多相关文章

  1. POJ 3041 - 最大二分匹配

    这道题实现起来还是比较简单的,但是理解起来可能有点困难. 我最开始想到的是贪心法,每次消灭当前小行星最多的一行或一列.然而WA了.Discuss区里已经有高人给出反例. 下面给出正确的解法 我们把行和 ...

  2. poj 2446 Chessboard (二分匹配)

    Chessboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12800   Accepted: 4000 Descr ...

  3. POJ 3057 Evacuation (二分匹配)

    题意:给定一个图,然后有几个门,每个人要出去,但是每个门每个秒只能出去一个,然后问你最少时间才能全部出去. 析:初一看,应该是像搜索,但是怎么保证每个人出去的时候都不冲突呢,毕竟每个门每次只能出一个人 ...

  4. POJ 2289 多重二分匹配+二分 模板

    题意:在通讯录中有N个人,每个人能可能属于多个group,现要将这些人分组m组,设各组中的最大人数为max,求出该最小的最大值 下面用的是朴素的查找,核心代码find_path复杂度是VE的,不过据说 ...

  5. POJ 1469 ZOJ1140 二分匹配裸题

    很裸,左点阵n,右点阵m 问最大匹配是否为n #include <cstdio> #include <cstring> #include <vector> usin ...

  6. poj 1469 COURSES (二分匹配)

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16877   Accepted: 6627 Descript ...

  7. Guardian of Decency POJ - 2771 【二分匹配,最大独立集】

    Problem DescriptionFrank N. Stein is a very conservative high-school teacher. He wants to take some ...

  8. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  9. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

随机推荐

  1. Linux开发工具之Makefile(上)

    二.makefile(上) 01.make工具   利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...

  2. 谷歌postman插件用不了的命令行指令

    谷歌postman插件用不了,想测试通过post提交传过来的参数测试,打开所在目录,shift右键,打开命令窗口,输入一下指令,即可获取到提交的值curl -X POST -d 'name=kpf&a ...

  3. contains选择器

    有这样一个问题: 一个列表里面,很多option,但是在不知道value,只知道他的内容的时候,怎么进行选择,比如: 北京市天津市上海市重庆市 在不知道他的value和index的时候,选择北京市,能 ...

  4. 我的github今天大手笔分享,welcome——fork

    看项目名就知道是什么样子的demo,还包含了数据库文件,welcome fork!

  5. Python的基本配置

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结 ...

  6. this,super关键字的使用

    this关键字 1.this是对象的别名,是当前类的实例引用 2.在类的成员方法内部使用,代替当前类的实例.在Java中,本质上是指针,相当于C++中的指针概念.如果方法中的成员在调用前没有操作实例名 ...

  7. c - 计算1到20的阶乘

    #include <stdio.h> /* 题目:求 1+2!+3!+...+20!的和 */ unsigned long long int factorial(long n) { uns ...

  8. 【转】 iOS使用AVFoundation实现二维码扫描

    原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应 ...

  9. 在Xcode7中安装Alcatraz(Xcode插件管理, 字体主题等)

    第一步:关闭 Xcode.第二步:如果你之前安装过Alcatraz,卸载它.在终端运行命令: rm -rf ~/Library/Application\ Support/Developer/Share ...

  10. Android Studio使用技巧

    1.ctrl+shift+F格式化代码时自动换行: 在settings里面找到Editor>General>Soft Wraps>设置选中Use soft wraps in edit ...