HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集)
Description
Presumably, you all have known the question of stable marriage match. A girl will choose a boy; it is similar as the game of playing house we used to play when we are kids. What a happy time as so many friends playing together. And it is normal that a fight or a quarrel breaks out, but we will still play together after that, because we are kids.
Now, there are 2n kids, n boys numbered from 1 to n, and n girls numbered from 1 to n. you know, ladies first. So, every girl can choose a boy first, with whom she has not quarreled, to make up a family. Besides, the girl X can also choose boy Z to be her boyfriend when her friend, girl Y has not quarreled with him. Furthermore, the friendship is mutual, which means a and c are friends provided that a and b are friends and b and c are friend.
Once every girl finds their boyfriends they will start a new round of this game—marriage match. At the end of each round, every girl will start to find a new boyfriend, who she has not chosen before. So the game goes on and on.
Now, here is the question for you, how many rounds can these 2n kids totally play this game?
Input
There are several test cases. First is a integer T, means the number of test cases.
Each test case starts with three integer n, m and f in a line (3<=n<=100,0<m<nn,0<=f<n). n means there are 2n children, n girls(number from 1 to n) and n boys(number from 1 to n).
Then m lines follow. Each line contains two numbers a and b, means girl a and boy b had never quarreled with each other.
Then f lines follow. Each line contains two numbers c and d, means girl c and girl d are good friends.
Output
For each case, output a number in one line. The maximal number of Marriage Match the children can play.
Sample Input
1
4 5 2
1 1
2 3
3 2
4 2
4 4
1 4
2 3
Sample Output
2
Http
HDU:https://vjudge.net/problem/HDU-3081
Source
二分图,并查集
题目大意
有2*n个点,现在前n个点与后n个点有若干对应关系,求有多少种二分图完美匹配的方案
解决思路
首先不考虑朋友关系。我们可以每次做二分图匹配时,如果是完美匹配,就删掉那些匹配边,再跑二分图匹配,方案数+1。若不是完美匹配,则说明已经无解,退出即可。
再来考虑朋友关系。因为朋友关系是可以传递的,所以我们可以用并查集来维护再同一个朋友集合中的人。那么只要这一个朋友集合内有一个人可以连到u,则这个集合中的所有人都可以连到u。
最后是图论结构的选择。因为本题数据范围不大,所以可以采用邻接矩阵的方式,同时这也可以很方便地支持删除操作,还不需要判重。
另:这里用匈牙利算法实现二分图匹配,具体可以参考这两篇博客:
http://www.cnblogs.com/SYCstudio/p/7138221.html
http://www.cnblogs.com/SYCstudio/p/7138230.html
另:本题还可以用网络流最大流的方式解决,具体请看这篇文章
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxN=201;
const int maxM=maxN*maxN*2;
const int inf=2147483647;
int n,m;
int Map[maxN][maxN];
int Match[maxN];
int use[maxN];
int Mayuri[maxN];
int Find(int x);//并查集寻找祖先同时路径压缩
bool Hungary(int u);//匈牙利算法求解二分图匹配
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
memset(Map,0,sizeof(Map));//多组数据
int f;
scanf("%d%d%d",&n,&m,&f);
for (int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
Map[u][v]=1;//先连上边
}
for (int i=1;i<=n;i++)//并查集初始化
Mayuri[i]=i;
for (int i=1;i<=f;i++)
{
int u,v;
scanf("%d%d",&u,&v);//读入朋友关系
int fu=Find(u);//合并并查集
int fv=Find(v);
if (fu!=fv)
Mayuri[fu]=fv;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (Find(i)==Find(j))
for (int k=1;k<=n;k++)//如果在同一个集合中,只要有一个连了就都要连边
if (Map[i][k]==1)
Map[j][k]=1;
int Ans=0;//统计方案数
while (1)//多次求解二分图匹配
{
int matchcnt=0;//统计匹配个数
memset(Match,-1,sizeof(Match));//匈牙利算法求解最大流
for (int i=1;i<=n;i++)
{
memset(use,0,sizeof(use));
if (Hungary(i))
matchcnt++;
}
if (matchcnt<n)//当匹配数小于n时,不存在完美匹配,退出
break;
for (int i=1;i<=n;i++)//删去本次匹配中用到的边
Map[Match[i]][i]=0;
Ans++;
}
printf("%d\n",Ans);
}
return 0;
}
int Find(int x)
{
if (Mayuri[x]!=x)
Mayuri[x]=Find(Mayuri[x]);
return Mayuri[x];
}
bool Hungary(int u)
{
for (int i=1;i<=n;i++)
if ((Map[u][i]==1)&&(use[i]==0))
{
use[i]=1;
if ((Match[i]==-1)||(Hungary(Match[i])))
{
Match[i]=u;
return 1;
}
}
return 0;
}
HDU 3081 Marriage Match II (二分图,并查集)的更多相关文章
- HDU 3081 Marriage Match II (二分+并查集+最大流)
题意:N个boy和N个girl,每个女孩可以和与自己交友集合中的男生配对子;如果两个女孩是朋友,则她们可以和对方交友集合中的男生配对子;如果女生a和女生b是朋友,b和c是朋友,则a和c也是朋友.每一轮 ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- HDU 3081 Marriage Match II(二分法+最大流量)
HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...
- HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 3081 Marriage Match II 二分 + 网络流
Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...
- Marriage Match II(二分+并查集+最大流,好题)
Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 3081 Marriage Match II (二分+网络流+并查集)
注意 这题需要注意的有几点. 首先板子要快,尽量使用带当前弧优化的dinic,这样跑起来不会超时. 使用弧优化的时候,如果源点设置成0,记得将cur数组从0开始更新,因为有的板子并不是. 其次这题是多 ...
- HDU 3081 Marriage Match II 最大流OR二分匹配
Marriage Match IIHDU - 3081 题目大意:每个女孩子可以和没有与她或者是她的朋友有过争吵的男孩子交男朋友,现在玩一个游戏,每一轮每个女孩子都要交一个新的男朋友,问最多可以玩多少 ...
- HDU 3081 Marriage Match II
二分图的最大匹配+并查集 每次匹配完之后,删除当前匹配到的边. #include<cstdio> #include<cstring> #include<cmath> ...
随机推荐
- Linux下性能调试工具运维笔记
作为一名资深的linux运维工程师,为方便了解和追求服务器的高性能,如cpu.内存.io.网络等等使用情况,要求运维工程师必须要熟练运用一些必要的系统性能调试工具,liunx下提供了众多命令方便查看各 ...
- M1/M2总结
在团队项目中,我是dev之一,负责的部分主要是排序部分. 应该说在团队中大家都各司其职,尤其是PM在组织方面也费了很多心思. 当然我个人因为空间上的距离和团队的联系不是那么密切…… 如同老师所言,这是 ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
- Linux内核分析(第七周)
可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序怎么来的? 预处理: gcc -E -o hello.cpp hello.c -m32 *负责把include的文件包含进来及宏 ...
- package.json中的几种依赖注册对象解析
本博文根据官网+google翻译+自己的理解,欢迎指出翻译的不到位的地方. package.json的重要性不言而喻,一直以来对几种依赖注册对象的区别和作用不是很了解,今日一探究竟. dependen ...
- C++课程学习建议
从C到C++,学院都采用了机房授课模式,也在探索更为高效的实践与理论融合的教学方法,对于课程学习来说,仍有以下建议: 1.多看书.看书是理解基本概念的必备手段.也是学习的根本.应将课前预习.课后复习联 ...
- Daily Scrum - 12/15-21
Meeting Minutes 没有什么实质性进展: 添加/完成了一个新feature,即使用非线性的函数作为速度条的设定: 等待与travis开会,讨论下一步的feature = =: 阅读code ...
- iOS 模拟器“安装”app
1.首先在模拟器上运行我们的app程序 2.执行以下命令: ditto -ck --sequesterRsrc --keepParent `ls - -d -t ~/Library/Developer ...
- yarn工具的使用
<!-- yarn init === npm init --> <!-- yarn login === npm adduser -->登录 <!-- yarn publi ...
- 关于windows内存的一些简单看法
1. 公司的产品有一个检查windows操作系统的功能,验证是否满足 只能客户端 的运行需求: 这里面的可用虚拟内存是128T 感觉非常奇怪了. 然后自己想了下128T 是 2的 47次方 猜想是不是 ...