题意:

有编号为1~n的女生和1~n的男生配对

首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架

然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友

进行配对的要求满足其一即可。
1.a女生没有和b男生吵过架
2.a女生的朋友和b男生没有吵过架

每进行一轮之后重新配对,配过得一对不可再配,问最多能进行几轮。

解析:

  一看就是先用并查集或者Floyd  都行

然后这类题目都是二分那个要求的值  然后源点s向X集建立权值为mid的边  X集向Y集建立权值 为1的边  Y集向汇点t建立权值为mid的边 跑最大流然后不断更改mid 使之最大或最小即可

  二分游戏的轮数 设为mid

  s 到每个女孩 建边 权值为mid   女孩到每个可以配对的男孩建边 权值为 1   男孩到t建边权值为mid

  

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define pd(a) printf("%d\n", a);
#define plld(a) printf("%lld\n", a);
#define pc(a) printf("%c\n", a);
#define ps(a) printf("%s\n", a);
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff;
int n, m, z, s, t, cnt;
int f[maxn], re[][];
int d[maxn], cur[maxn], head[maxn];
struct node
{
int u, v, c, next;
}Node[maxn << ]; void add_(int u, int v, int c)
{
Node[cnt].u = u;
Node[cnt].v = v;
Node[cnt].c = c;
Node[cnt].next = head[u];
head[u] = cnt++;
} void add(int u, int v, int c)
{
add_(u, v, c);
add_(v, u, );
} bool bfs()
{
queue<int> Q;
mem(d, );
Q.push(s);
d[s] = ;
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int i = head[u]; i != -; i = Node[i].next)
{
node e = Node[i];
if(!d[e.v] && e.c > )
{
d[e.v] = d[u] + ;
Q.push(e.v);
if(e.v == t) return ;
}
}
}
return d[t] != ;
} int dfs(int u, int cap)
{
int ret = ;
if(u == t || cap == )
return cap;
for(int &i = cur[u]; i != -; i = Node[i].next)
{
node e = Node[i];
if(d[e.v] == d[u] + && e.c > )
{
int V = dfs(e.v, min(cap, e.c));
Node[i].c -= V;
Node[i ^ ].c += V;
ret += V;
cap -= V;
if(cap == ) break;
}
}
if(cap > ) d[u] = -;
return ret;
} int Dinic()
{
int ans = ;
while(bfs())
{
memcpy(cur, head, sizeof(head));
ans += dfs(s, INF);
}
return ans;
} int find(int x)
{
return f[x] == x ? x : (f[x] = find(f[x]));
} void build(int mid)
{
for(int i = ; i <= n; i++)
{
add(s, i, mid);
add(n + i, t, mid);
}
for(int i = ; i <= n; i++)
for(int k = n + ; k <= n * ; k++)
if(re[i][k]) add(i, k, );
} void init()
{
for(int i = ; i < maxn; i++) f[i] = i;
mem(re, );
mem(head, -);
cnt = ;
} int main()
{
int T;
rd(T);
while(T--)
{
init();
int a, b;
rd(n), rd(m), rd(z);
s = , t = n * + ;
for(int i = ; i < m; i++)
{
rd(a), rd(b);
b += n;
re[a][b] = re[b][a] = ;
}
for(int i = ; i < z; i++)
{
rd(a), rd(b);
int r = find(a);
int l = find(b);
if(r != l) f[l] = r;
}
for(int i = ; i <= n; i++)
{
for(int j = i + ; j <= n; j++)
{
if(find(i) == find(j))
for(int k = n + ; k <= n * ; k++)
re[i][k] = re[j][k] = (re[i][k] || re[j][k]);
}
}
int x = , y = ;
while(x <= y)
{
mem(head, -);
cnt = ;
int mid = x + (y - x) / ;
build(mid);
if(Dinic() == mid * n) x = mid + ;
else y = mid - ;
}
pd(y); } return ;
}

Marriage Match II HDU - 3081(二分权值建边)的更多相关文章

  1. N - Marriage Match II - HDU 3081(最大流)

    题目大意:有一些男孩和女孩玩一个游戏,每个女孩都可以挑一个男孩来进行这个游戏(所有人都要参加),女孩只会挑选她喜欢的男孩,并且她们认为她们朋友喜欢的男孩她们也是喜欢的(朋友的男朋友也是我的男朋友??? ...

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

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

  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 (二分图,并查集) Description Presumably, you all have known the question of stab ...

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

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

  6. HDU3081:Marriage Match II (Floyd/并查集+二分图匹配/最大流(+二分))

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. hdu3081 Marriage Match II(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Marriage Match II Time Limit: 2000/1000 M ...

  8. Marriage Match II(二分+并查集+最大流,好题)

    Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Othe ...

  9. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

随机推荐

  1. 【内存溢出】Maven编译时内存溢出的问题解决方式

    原文地址:https://www.cnblogs.com/sunny3096/p/7524635.html 编译源码时报出java.lang.OutOfMemoryError: Java heap s ...

  2. vue echarts 动态数据

    安装echarts依赖 npm install echarts -S 或者使用国内的淘宝镜像: 安装 npm install -g cnpm --registry=https://registry.n ...

  3. Echarts x轴文本内容太长的几种解决方案

    Echarts 标签中文本内容太长的时候怎么办 ? - 1对文本进行倾斜 在xAxis.axisLabe中修改rotate的值 xAxis: { data: ["衬衫11111", ...

  4. tortoisegit密钥与git密钥配置

    在客户端生成密钥并将公钥上传到服务器可以避免每次连接git服务器都要登录的尴尬. 但git的私钥是不能直接用在tortoisegit上的,需要用tortoisegit的puttygen转换一下,详细过 ...

  5. Python之拆分目录

    成分目录的好习惯,使得代码保持整洁,为以后的代码管理提供方便. 一.概念 一般目录有以下几个: bin:程序入口,存放start文件. conf:存放固定的配置信息,比如:连接redis的配置信息.连 ...

  6. node学习: package.json

    package.json 定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据) 1.创建 package.json npm init npm init –yes 2.p ...

  7. Java使用Redis实现分布式锁来防止重复提交问题

    如何用消息系统避免分布式事务? - 少年阿宾 - BlogJavahttp://www.blogjava.net/stevenjohn/archive/2018/01/04/433004.html [ ...

  8. IdentityServer4【Topic】之登出

    Sign-out 登出 IdentityServer的登出就像删除认证cookie一样简单,但是为了完成一个完整的联合签名,我们必须考虑将用户从客户端应用程序中(甚至可能是上游的Identity提供者 ...

  9. [转帖]KMS 是什么 以及 优缺点

    产品激活 比如Windows激活 , office激活 等激活的原理是什么? KMS等激活工具安全吗? http://www.cnblogs.com/flowerslip/p/8370832.html ...

  10. Web移动端---iPhone X适配(底部栏黑横线)

    一.相信大家有被iPhone X底部黑色横线支配的恐惧 上面我们可以看到,底部的导航栏被一条黑色横线所盖住,那么就很烦.下面我们可以开始进行适配环节 1.首先我们可以用 JS 判断手机环境是不是 iP ...