zoukankan      html  css  js  c++  java
  • 二分匹配的常用建图方法

    学习了一些常用建图方法,又理解了一遍二分,感觉更加清晰了。

    1.行列匹配法;在一个矩阵中,加入上面一些点有人,现在有一些箭能将一行或一列的人杀死,问最少需要多少箭?
    因为箭要最少,所以要尽可能的在一行或一列上,即最小顶点覆盖问题。这时可以通过行列来进行二分匹配;假如位置(1,1),(1,3),(2,2),
    (3,1) 则横坐标1 2 3,纵坐标 1 2 3间有一定的关系,最小点覆盖=最大匹配数;


    2.反建法;假如有一个嫉妒封建的老师,他不希望同学间发生恋情。老师发现,满足一下条件的同学发生恋情的几率小:
    1》身高差〉40 2》性别相同 3》爱好不同的音乐4》爱好同类型的运动;由于相同性别的同学不可能发生恋情,所以就成了男生和女生间的关系;
    由于正面直接求答案可能有误,可以先求出能发生恋情的可能,把有上面任一条件的男女连一条边,然后一减就是答案了;

    3.拆点法;拆点法适用于解决最小路径覆盖问题;给出一张图,需要找到一些路径,可以把所有的点都经过,并且路径不产生交叉。这时可以把点1拆为x1,y1、
    点2拆为x2,y2.........;这时求二分图最大匹配,可以得到每个匹配对应一个路径覆盖,将2个点连在一起,最后所有点减去匹配数(即相连的点只要一条既可)就是
    最小路径覆盖数;最小路径覆盖=最大独立集
    最小路径覆盖:假如有一张图,用尽可能的路径把所有的点经历一遍。hdu4160;


    4:一行变多行,一列变多列;如第一种题目一样,不能再同一行或列有点,但是现在增加了墙,某一行多了一个墙,那么这一行就成了2行;用这种方法既可;


    5:黑白染色法(也称奇偶匹配);一张图中有一些点,现在要用1*2的长条去覆盖这些点,问至少需要多少;我是这样理解的:,先对每个能放的点标号,对于每个点,如果他的上下左右能够放
    长条,那么就从该点到其方向上的点连一条边,这样建图就完成了;求一次最大匹配既可;hdu4185

  • 相关阅读:
    寻找大富翁
    C++ STL sort()函数用法
    众数
    平方因子
    Hdu 1089 A+B for Input-Output Practice (I)
    Hdu 1090 A+B for Input-Output Practice (II)
    Hdu 1083 Courses
    Hdu 1069 Monkey and Banana
    Hdu 1062 Text Reverse
    Hdu 1068 Girls and Boys
  • 原文地址:https://www.cnblogs.com/sweat123/p/4542003.html
Copyright © 2011-2022 走看看