http://acm.hdu.edu.cn/showproblem.php?pid=3081

题意:有n个男生n个女生,他们只有没有争吵或者女生a与男生A没有争吵,且女生b与女生a是朋友,因此女生b也可以和男生A过家家(具有传递性)。给出m个关系,代表女生a和男生b没有争吵过。给出k个关系,代表女生a与女生b是好朋友。每一轮过家家之后,女生只能选择可以选择并且没选过的男生过家家,问游戏能进行几轮。

思路:因为n<=100,因此支持O(n^3)的算法,挺容易想到是一个二分图匹配的。(出现在我的网络流专题里。让我想了好久最大流的做法。做完后搜题解才发现有二分答案然后跑最大流的做法)。用邻接矩阵做比较方便,一开始用并查集处理女生的集合,然后暴力枚举,处理出传递性。然后每次跑完匈牙利算法,就把这次匹配的边去掉(保证不会重复),并且答案加1,直到不能完美匹配就退出。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 255
int vis[N], mp[N][N], fa[N], match[N], n;
int Find(int x) { if(x == fa[x]) return x; return fa[x] = Find(fa[x]); }
void Merge(int x, int y) { x = Find(x), y = Find(y); if(x != y) fa[x] = y; }
bool DFS(int u) {
for(int i = ; i <= n; i++) {
if(mp[u][i] && !vis[i]) {
vis[i] = ;
if(match[i] == - || DFS(match[i])) {
match[i] = u;
return true;
}
}
}
return false;
}
void solve() {
int ans = , res;
while(true) {
res = ;
memset(match, -, sizeof(match));
for(int i = ; i <= n; i++) {
memset(vis, , sizeof(vis));
if(DFS(i)) res++;
}
if(res != n) break;
for(int i = ; i <= n; i++) mp[match[i]][i] = ;
ans++;
}
printf("%d\n", ans);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
int m, k;
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= n; i++) fa[i] = i;
memset(mp, , sizeof(mp));
for(int i = ; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); mp[u][v] = ; }
for(int i = ; i <= k; i++) { int u, v; scanf("%d%d", &u, &v); Merge(u, v); }
for(int i = ; i <= n; i++) // 传递
for(int j = ; j <= n; j++)
if(Find(i) == Find(j))
for(int x = ; x <= n; x++) {
if(mp[i][x]) mp[j][x] = ;
if(mp[j][x]) mp[i][x] = ;
}
solve();
}
return ;
}

HDU 3081:Marriage Match II(二分图匹配+并查集)的更多相关文章

  1. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  2. HDU 3081 Marriage Match II (二分图,并查集)

    HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...

  3. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  4. HDU 3081 Marriage Match II(二分法+最大流量)

    HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...

  5. HDU 3081 Marriage Match II 二分 + 网络流

    Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...

  6. HDU 3081 Marriage Match II 最大流OR二分匹配

    Marriage Match IIHDU - 3081 题目大意:每个女孩子可以和没有与她或者是她的朋友有过争吵的男孩子交男朋友,现在玩一个游戏,每一轮每个女孩子都要交一个新的男朋友,问最多可以玩多少 ...

  7. HDU 3081 Marriage Match II

    二分图的最大匹配+并查集 每次匹配完之后,删除当前匹配到的边. #include<cstdio> #include<cstring> #include<cmath> ...

  8. HDU 3081 Marriage Match II (二分+网络流+并查集)

    注意 这题需要注意的有几点. 首先板子要快,尽量使用带当前弧优化的dinic,这样跑起来不会超时. 使用弧优化的时候,如果源点设置成0,记得将cur数组从0开始更新,因为有的板子并不是. 其次这题是多 ...

  9. HDU - 3081 Marriage Match II 【二分匹配】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...

  10. HDU 3081 Marriage Match II (二分+并查集+最大流)

    题意:N个boy和N个girl,每个女孩可以和与自己交友集合中的男生配对子;如果两个女孩是朋友,则她们可以和对方交友集合中的男生配对子;如果女生a和女生b是朋友,b和c是朋友,则a和c也是朋友.每一轮 ...

随机推荐

  1. 说谎的简单工厂模式设计模式&amp;工厂方法模式&amp;Abstract Factory模式

    工厂模式被分成三个:简单工厂模式,抽象工厂模式和工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口.让子类决定实例化哪一个类,讲一个类的实例化 延迟 ...

  2. qt 透明度设置(setWindowOpacity 和 setAutoFillBackground 和 带透明度的画刷填充就好了)

    1,父窗口透明// 设置背景图片 QPalette pa;setAutoFillBackground(true);pa.setBrush(QPalette::Background,QBrush(QPi ...

  3. 将自定义控件加载到RichTextbox并进行交互

    先前遇到一个问题,将自定义控件加载到RichTextbox后,无法触发自定义控件的各种事件,最终找到解决办法:设置RichTextbox的IsDocumentEnabled="True&qu ...

  4. WPF的逻辑树和视觉树

    原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...

  5. StackExchange.Redis 封装类

    using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using ...

  6. 【C#】VS2012+InstallShield2013制作软件更新包

    原文:[C#]VS2012+InstallShield2013制作软件更新包 上篇文章介绍了如何使用installshield制作软件的安装包,见地址:http://blog.csdn.net/cat ...

  7. 【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题

    原文:[C#]解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHo ...

  8. mingw 构建 mysql-connector-c-6.1.9记录(26种不同的编译错误,甚至做了一个windows系统返回错误码与System V错误码的一个对照表)

    http://www.cnblogs.com/oloroso/p/6867162.html

  9. TIFF图片简介

    每个TIFF文件都是从指示字节顺序的两个字节开始的.“II”表示小字节在先.“MM”表示大字节在先字节顺序.后面的两个字节表示数字42.数字42是“为了其深刻的哲学意义"而选择的. 42的读 ...

  10. Oracle emca on linux

    http://blog.csdn.net/haibusuanyun/article/details/16338591 bash-3.2$  lsnrctl status LSNRCTL for Lin ...