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. WPF特效-鱼游动动画

    原文:WPF特效-鱼游动动画   实现思路:           通过VisualBrush Binding方式获取鱼局部图像,在Viewport3D中创建ModelVisual3D块并把获取到的局部 ...

  2. Bootstrap按钮组 按钮工具栏 嵌套

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  3. WPF 中style文件的引用

    原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...

  4. texbox 禁用copy paster cut

    <TextBox CommandManager.PreviewExecuted="textBox_PreviewExecuted" ContextMenu="{x: ...

  5. 图像滤镜艺术---(Lightleaks Filter)漏光滤镜

    原文:图像滤镜艺术---(Lightleaks Filter)漏光滤镜 (Lightleaks Filter)漏光滤镜 漏光拍摄其实就是一种摄影手法,最初是因为强烈光照导致相片交卷的过分曝光,最终在成 ...

  6. 【python】python调用adb

    本期分享下python如何调用adb: 1.导入os模块 import os 2.python中调用adb命令语法 print("显示机型信息:") os.system('adb ...

  7. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  8. 快速写入Xml文件

    我们在做一些操作的时候会需要生成日志,Xml文件就是我们常用的一种日志文件. 普通操作Xml文件的代码遇到大数据量的话就很慢了. 用这个生成Xml文件的话,即使数据量很大,也很快 private vo ...

  9. javascript的强制类型转换

    1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...

  10. Git的HTTP proxy设置方法

    今天用git push代码到Github死活上不去,最后设置了Http代理才上去了,在这小记一下设置方法 1.依次打开:项目地址-->.git(可能要选择显示隐藏文件夹才能看到)-->co ...