本题就是先推断能否够组成二分图,然后用匈牙利算法求出最大匹配。

究竟怎样学习一种新算法呢?

我也不知道什么方法是最佳的了,由于看书本和大牛们写的匈牙利算法具体分析,看了几乎相同两个小时没看懂,最后自己直接看代码,竟然不到半个小时看懂了。然后就能够直接拿来解题啦。

比方topcoder上有这个算法的非常具体的分析。真没看懂。

代码竟然比分析更清晰了?我也不好下结论。

可是我认为基本的思想还是有作用的。

说说我对这个算法的理解吧:

1 假设二分图分为两个集合 U, V,那么从一个集合U出发

2 U的一个点u连线到V的一个点v,假设v点没有别的点连接,那么就算连接成功了

3 假设v点有别的点u2连接了。那么就u2就须要让u连接,然后u2递归寻找别的路径点去连接。假设寻找成功找到v2。那么u2就连接v2;

4 假设u2没有找到别的点连接,那么u2就不让u了,所以u就不能连接v了。

5 那么u就继续寻找别的点连接,反复上述过程,直到u没找到别的点连接。那么u就是连接失败。继续下一个点查找。

就是一个递归查找的过程。

这位大牛的分析。我也是没看懂:https://www.byvoid.com/blog/hungary

可是能够參考他的图。然后依照我上面说的方法连接以下的图。保证你懂了:

本题C++程序:

bool isBipartite_2(vector<vector<bool> > & stus, int src)
{
vector<int> colors(stus.size(), -1);
colors[src] = 0;
queue<int> qu;
qu.push(src);
while (qu.size())
{
int u = qu.front();
qu.pop();
for (int v = 0; v < (int)stus.size(); v++)
{
if (stus[u][v] && colors[v] == -1)
{
colors[v] = 1 - colors[u];
qu.push(v);
}
else if (stus[u][v] && colors[v] == colors[u]) return false;
}
}
return true;
} bool hunDfs_2(vector<vector<bool> > &stus, vector<bool> &used,
vector<int> &linker, int src)
{
for (int d = 0; d < (int)stus.size(); d++)
{
if (stus[src][d] && !used[d])
{
used[d] = true;
if (linker[d] == -1 ||
hunDfs_2(stus, used, linker, linker[d]))
{
linker[d] = src;
return true;
}
}
}
return false;
} int hungary_2(vector<vector<bool> > &stus)
{
int res = 0;
vector<int> linker(stus.size(), -1);
for (int i = 0; i < (int)stus.size(); i++)
{
vector<bool> used(stus.size(), false);
if (hunDfs_2(stus, used, linker, i)) res++;
}
return res;
} int main()
{
int n, m, u, v;
while (scanf("%d %d", &n, &m) != EOF)
{
vector<vector<bool> > stus(n, vector<bool>(n, 0));
while (m--)
{
scanf("%d %d", &u, &v);
stus[u-1][v-1] = stus[v-1][u-1] = true;//记得:这是个无向图,否则错
}
if (isBipartite_2(stus, 0))
{
printf("%d\n", hungary_2(stus)>>1);
}
else puts("No");
}
return 0;
}

HDU 2444 The Accomodation of Students二分图判定和匈牙利算法的更多相关文章

  1. HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)

    题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...

  2. HDU 2444 The Accomodation of Students 二分图判定+最大匹配

    题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...

  3. HDU 2444 - The Accomodation of Students - [二分图判断][匈牙利算法模板]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Time Limit: 5000/1000 MS (Java/Others) Mem ...

  4. HDU 2444 The Accomodation of Students (二分图存在的判定以及最大匹配数)

    There are a group of students. Some of them may know each other, while others don't. For example, A ...

  5. hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS     Me ...

  6. HDU 2444 The Accomodation of Students(二分图判定+最大匹配)

    这是一个基础的二分图,题意比较好理解,给出n个人,其中有m对互不了解的人,先让我们判断能不能把这n对分成两部分,这就用到的二分图的判断方法了,二分图是没有由奇数条边构成环的图,这里用bfs染色法就可以 ...

  7. hdu 2444 The Accomodation of Students 判断二分图+二分匹配

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  8. HDU 2444 The Accomodation of Students【二分图最大匹配问题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:首先判断所有的人可不可以分成互不认识的两部分.如果可以分成 ,则求两部分最多相互认识的对数. ...

  9. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)

    [题目链接]:pid=2444">click here~~ [题目大意]: 给出N个人和M对关系,表示a和b认识,把N个人分成两组,同组间随意俩人互不认识.若不能分成两组输出No,否则 ...

随机推荐

  1. UGUI 屏幕适配 导致 BoxCollider无效 解决记录

    从来没有做过一个完整的游戏,所以用UGUI来做个手游界的 " Hello World " - 微信打飞机.看起来easy做起来也碰到各种奇异的问题. 昨天导出安卓包之后,在我的MX ...

  2. PHP的CLI综合

    tip1:传入参数 使用标准的输入和输出    PHP CLI会定义三个常量,以便让在命令行提示符下与解释器进行交互操作更加容易.这些常量见表格A.表格A 常量 说明STDIN 标准的输入设备STDO ...

  3. C#.NET常见问题(FAQ)-如何清空stringbuilder

    就红色的代码可以: System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("hello" ...

  4. Office WORD如何在图片上添加文字

    如图所示,在图片格式中选择图片衬于文字下方即可,这样看起来感觉就像在图片上直接加字一样,没有生硬的感觉. 最终效果: Word如何在图片上添加文字Word如何在图片上添加文字Word如何在图片上添加文 ...

  5. VS编程常见的编译和链接错误

    常见错误1: Error 2 error LNK1120: 1 unresolved externals Error 1 error LNK2019: unresolved external symb ...

  6. objective-c 字符串基本操作

    .定义一个字符串a, 截取a 的某一个部分,复制给b, b必须是int型 NSString *a = @"1.2.30"; ,)] intValue]; NSLog(@" ...

  7. JSTL标签引入(web基础学习笔记十八)

    一.JSTL包下载和引入 1.0.简介 JSTL全名为JavaServer Pages Standard Tag Library 1.1.下载包 下载地址:http://archive.apache. ...

  8. U872-结算成本处理步骤及索引处理

    U872每月都须要做月结,对于制造企业来说,结算成本处理是不可缺少的一个处理环节,每次查询出来待暂估记录也比較多(我接触到的有3万左右),暂估时间一般要2-3小时左右,若调用的大表索引碎片多时,会须要 ...

  9. Modifying a Request or Response

    To make custom changes to web requests and responses, use FiddlerScript to add rules to Fiddler's On ...

  10. Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...