题目链接

一开始是想不断的把边插进去,然后再去考虑我们每次都加进去边权为1的边,直到跑到第几次就没法继续跑下去的这样的思路,果不其然的T了。

然后,就是想办法咯,就想到了二分答案。

首先,我们一开始处理关系,(一开始看错了男女关系,结局懵逼了好久),注意输入是女选男。然后,就是去处理咯,我们先要去考虑,女生之间为朋友的话,又由于朋友关系是可以推的,所以我们不妨用并查集去维护这层关系,并且把总的关系推上到并查集的根上去。

然后,就是怎么样去想这个二分答案的过程了,我们可以假设玩了x轮,这么就代表了每个女孩纸被选择了x次,每个男孩纸也被选择了x次,(两者少了其中一者都不行)。那么,我们是不是可以从源点连到每个女孩纸的边权是x,然后从每个男孩纸连到汇点的边权是x。然后男孩、女孩之间的关系,就是我们之前并查集处理出来的了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = , maxE = 3e4 + , st = ;
int N, M, fr, head[maxN], cur[maxN], cnt, ed, root[maxN], mod_cnt, mod_head[maxN];
bool mp[maxN][maxN];
int fid(int x) { return x == root[x] ? x : (root[x] = fid(root[x])); }
struct Eddge
{
int nex, to, flow;
Eddge(int a=-, int b=, int c=):nex(a), to(b), flow(c) {}
}model[maxE], edge[maxE];
inline void addEddge(int u, int v, int w)
{
edge[cnt] = Eddge(head[u], v, w);
head[u] = cnt++;
}
inline void _add(int u, int v, int w) { addEddge(u, v, w); addEddge(v, u, ); }
int deep[maxN];
queue<int> Q;
inline bool bfs()
{
for(int i=; i<=ed; i++) deep[i] = ;
while(!Q.empty()) Q.pop();
Q.push(st); deep[st] = ;
while(!Q.empty())
{
int u = Q.front(); Q.pop();
for(int i=head[u], v, f; ~i; i=edge[i].nex)
{
v = edge[i].to; f = edge[i].flow;
if(f && !deep[v])
{
deep[v] = deep[u] + ;
Q.push(v);
}
}
}
return deep[ed];
}
inline int dfs(int u, int dist)
{
if(u == ed) return dist;
for(int &i=cur[u], v, f; ~i; i=edge[i].nex)
{
v = edge[i].to; f = edge[i].flow;
if(f && deep[v] == deep[u] + )
{
int di = dfs(v, min(dist, f));
if(di)
{
edge[i].flow -= di;
edge[i^].flow += di;
return di;
}
}
}
return ;
}
inline int Dinic()
{
int ans = , tmp;
while(bfs())
{
for(int i=; i<=ed; i++) cur[i] = head[i];
while((tmp = dfs(st, INF))) ans += tmp;
}
return ans;
}
struct Query
{
int u, v;
Query(int a=, int b=):u(a), v(b) {}
}qes[];
inline void init()
{
cnt = ; ed = (N<<) + ;
memset(head, -, sizeof(head));
for(int i=; i<=N; i++) root[i] = i;
for(int i=; i<=N; i++) for(int j=; j<=N; j++) mp[i][j] = false;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d%d%d", &N, &M, &fr);
init();
for(int i=, u, v; i<=M; i++)
{
scanf("%d%d", &u, &v);
mp[u][v] = true;
}
for(int i=, u, v, fu, fv; i<=fr; i++)
{
scanf("%d%d", &u, &v);
fu = fid(u); fv = fid(v);
if(fu == fv) continue;
root[fu] = fv;
for(int j=; j<=N; j++)
{
if(mp[fu][j] && !mp[fv][j]) mp[fv][j] = true;
}
}
for(int i=, u; i<=N; i++)
{
u = fid(i);
for(int j=; j<=N; j++)
{
if(mp[u][j]) _add(i, j + N, );
}
}
mod_cnt = cnt;
for(int i=; i<cnt; i++) model[i] = edge[i];
for(int i=; i<=ed; i++) mod_head[i] = head[i];
int ans = , l = , r = N, mid = ;
while(l <= r)
{
mid = (l + r) >> ;
cnt = mod_cnt;
for(int i=; i<cnt; i++) edge[i] = model[i];
for(int i=; i<=ed; i++) head[i] = mod_head[i];
for(int i=; i<=N; i++)
{
_add(st, i, mid);
_add(i + N, ed, mid);
}
if(Dinic() >= N * mid)
{
ans = mid;
l = mid + ;
}
else r = mid - ;
}
printf("%d\n", ans);
}
return ;
}

Marriage Match II 【HDU - 3081】【并查集+二分答案+最大流】的更多相关文章

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

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

  2. Marriage Match II HDU - 3081(二分权值建边)

    题意: 有编号为1~n的女生和1~n的男生配对 首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 然后输入f组,c,d表示编号为c的女生和编号为d的女生是朋友 进行配对的要求满足其一即 ...

  3. HDU 3277 Marriage Match III(并查集+二分答案+最大流SAP)拆点,经典

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. RPC-基于原生java实现

    一:什么是RPC 远程过程调用(Remote Procedure Call).就是调用其他业务方的方法的时候,就像是调用自己本地的方法一样. 二:java rpc实现简介 服务端(使用反射) (1)服 ...

  2. CVE-2016-0822-MTK-drivers/misc/mediatek/connectivity/common/combo/linux/wmt_dev.c#1158

    CVE-2016-0822-MTK-drivers/misc/mediatek/connectivity/common/combo/linux/wmt_dev.c#1158 //mediatek/ke ...

  3. P5444 [APIO2019]奇怪装置

    传送门 考虑求出最小的循环节 $G$ 使得 $t,t+G$ 得到的数对是一样的 由 $y \equiv t \mod B$ ,得到 $G$ 一定是 $B$ 的倍数,设 $zB=G$,则 $t,t+zB ...

  4. Java反射学习-3 - 反射获取属性,方法,构造器

    package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ...

  5. JUC并发包基本使用

    一.简介 传统的Java多线程开发中,wait.notify.synchronized等如果不注意使用的话,很容易引起死锁.脏读问题.Java1.5 版本开始增加 java.util.concurre ...

  6. asp.net 关于SessionId

    原文:https://www.cnblogs.com/zhang1999/p/7278020.html 登陆页面使用Session存储验证码,导致会话产生SessionId,从而导致会话固定,登陆后用 ...

  7. Ionic创建混合App(一)

    前言 最近公司要开始做App项目,最终选定了ionic开发方案,在这里我将学习的过程记录在这里,一方面避免自己忘记,另一方面方便大家交流学习.这里我们采用的是 Ionic2 + Angular2 : ...

  8. Python之路-Python常用模块-time模块

    一.time模块 常用的一种获取当前时间以及时间格式化的模块,模块名称:time time模块在Python原生安装中就存在所以不需要进行任何安装操作,直接使用即可. 导入方式: import tim ...

  9. Winfrom中数据的双向绑定(使用INotifyPropertyChanged)

    在WPF中新建项目是自动实现了INotifyPropertyChanged接口,用于数据绑定时非常的方便在winfrom中也可以实现INotifyPropertyChanged接口 将需要绑定的字段写 ...

  10. 微服务+DDD代码结构例子

    这是一个基本的微服务+DDD演示例子: 基于 Spring Boot 1.5.6 , Spring Cloud Edgware.SR4 Version 微服务 + DDD,个人觉得应该是首先是从微服务 ...