HDU--3081--Marriage Match II--最大匹配,匈牙利算法
Marriage Match II
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?
Each test case starts with three integer n, m and f in a line (3<=n<=100,0<m<n*n,0<=f<n). n means there are 2*n 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.
1
4 5 2
1 1
2 3
3 2
4 2
4 4
1 4
2 3
2
女生和女生之间仅仅要是好朋友,那么没吵过架的男生就都能在一起,女所有选择好了要在一起的男生就算一次匹配,然后再来。可是女生不能选先前选择过的男生,问最多能玩出几次这种匹配
#include <iostream>
#include <cstring>
using namespace std;
int n,map[111][111],vis[111],d[111],v[111],fa[111];
int Find(int x) //并查集——查找祖先
{
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y) //并查集——合并两点
{
x=Find(x);
y=Find(y);
if(x!=y)fa[x]=y;
}
int find(int x) //匈牙利算法
{
int i;
for(i=1;i<=n;i++)
if(map[x][i])
{
if(!vis[i])
{
vis[i]=1;
if(d[i]==-1||find(d[i]))
{
d[i]=x;
return 1;
}
}
}
return 0;
}
int main (void)
{
int t,m,f,i,j,k,l,s;
cin>>t;
while(t--&&cin>>n>>m>>f)
{
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
fa[i]=i;
for(i=0;i<m;i++)
{
cin>>j>>k;
map[j][k]=1;
}
for(i=0;i<f;i++)
{
cin>>k>>l;
Union(k,l); //先用并查集把女生中是好朋友的弄到一堆
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(Find(i)==Find(j) //假设i和j是好朋友
for(k=1;k<=n;k++)
if(map[i][k]||map[j][k]) //假设k没和i吵过架或者没和j吵过架
map[i][k]=map[j][k]=1; //那么k能被i与j选择
s=0;
while(1)
{
memset(d,-1,sizeof(d));
for(i=1,k=0;i<=n;i++)
{
memset(vis,0,sizeof(vis));
k+=find(i); //匈牙利算法记录匹配数
}
if(k==n)s++; //所有都匹配了就记录为一次
else break; //不然就结束
for(i=1;i<=n;i++) //然后把匹配男女的关系处理为吵架
map[d[i]][i]=0;
}
cout<<s<<endl;
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
HDU--3081--Marriage Match II--最大匹配,匈牙利算法的更多相关文章
- HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...
- HDU 3081 Marriage Match II(二分法+最大流量)
HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- HDU 3081 Marriage Match II 二分 + 网络流
Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...
- HDU 3081 Marriage Match II 最大流OR二分匹配
Marriage Match IIHDU - 3081 题目大意:每个女孩子可以和没有与她或者是她的朋友有过争吵的男孩子交男朋友,现在玩一个游戏,每一轮每个女孩子都要交一个新的男朋友,问最多可以玩多少 ...
- HDU - 3081 Marriage Match II 【二分匹配】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...
- HDU 3081 Marriage Match II
二分图的最大匹配+并查集 每次匹配完之后,删除当前匹配到的边. #include<cstdio> #include<cstring> #include<cmath> ...
- HDU 3081 Marriage Match II (二分+网络流+并查集)
注意 这题需要注意的有几点. 首先板子要快,尽量使用带当前弧优化的dinic,这样跑起来不会超时. 使用弧优化的时候,如果源点设置成0,记得将cur数组从0开始更新,因为有的板子并不是. 其次这题是多 ...
- HDU 3081 Marriage Match II (二分+并查集+最大流)
题意:N个boy和N个girl,每个女孩可以和与自己交友集合中的男生配对子;如果两个女孩是朋友,则她们可以和对方交友集合中的男生配对子;如果女生a和女生b是朋友,b和c是朋友,则a和c也是朋友.每一轮 ...
- hdu 2063 过山车 (最大匹配 匈牙利算法模板)
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最 ...
随机推荐
- 第二十次codeforces竞技结束 #276 Div 2
真是状况百出的一次CF啊-- 终于还Unrated了,你让半夜打cf 的我们怎样释怀(中途茫茫多的人都退场了)--虽说打得也不好-- 在这里写一下这一场codeforces的解题报告.A-E的 题目及 ...
- winXP JDK由1.8改为1.6
(1)直接在环境变量中删除配置的相关路径 path的值: C:\Documents and Settings\Administrator>path PATH=C:\Documents and S ...
- 使用jQuery实现tag便签去重效果
话不多说直接看代码 jsp页面的核心代码 <head> <script type="text/javascript" src="js/jQuery.js ...
- HTML学习笔记——各种居中对齐
0.前言 水平居中基本方法--指定块的宽度并设定块的左右外边距为auto,上下外边距可取0,那么该块能够在父元素中水平居中. 样式例如以下: 1:margin:0px auto 2:margi ...
- Java注解全面解析(转)
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- 一步一步学android之事件篇——单选按钮监听事件
在平常使用软件的时候,我们经常会碰见一些选择题,例如选择性别的时候,在男和女之间选,前面说过这个情况要用RadioGroup组件,那么点击了之后我们该怎么获取到选择的那个值呢,这就是今天要说的OnCh ...
- hdu 5015 233 Matrix(构造矩阵)
http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...
- 手机游戏产品经理(一)logo的印象非常重要,以促进
从事的工作有一段时间的产品,在产品上共享所以现在的一些经验和知识,并记录.首先,我现在做国外casino手游,如此专注casino展开游戏的主题. 首先说一款游戏的logo非常重要,假设设计的好.它能 ...
- Python使用MySQLdb操作MySQL
import MySQLdb,sys try: conn=MySQLdb.connect(host=,user=',db='db1') except Exception,e: print e sys. ...
- 项目中那些事|ListView中嵌套ListView问题
要在一个ListView中放入另一个ListView,也即在一个ListView的每个 item 中放入另外一个ListView.但刚开始的时候,会发现放入的子ListView会显示不完全(我这里只显 ...