题意:有n个男生和n个女生,玩结婚游戏,由女生选择男生;女生可以选择不会和她吵架的男生以及不会和她闺蜜吵架的男生,闺蜜的闺蜜也是闺蜜。问你最多可以进行多少轮,每一轮每个女生只能选择一个之前她没选过的男生。

思路:显然最少进行0轮,最多进行n轮,所以我们可以对轮数进行二分;源点到女生连一条容量为轮数的边,女生到她可选择的男生之间连一条容量为1的边,男生到汇点同样连一条容量为轮数的边,然后跑最大流判断是否满流。找到最大的轮数。要注意的是,每次跑最大流的时候都要重新建图。至于闺蜜的问题用一个并查集就可以了。

代码:

 #include<stdio.h>
#include<string.h>
#define min(x,y) (x)<(y)?(x):(y)
const int N=,M=N*N,INF=0x3f3f3f3f;
int n,l,r,s,t;
int c[N][N],tmpc[N][N];
int fa[N];
int h[N],gap[N];
int find(int a)
{
if(fa[a]!=a) return fa[a]=find(fa[a]);
return a;
}
void union_(int a,int b)
{
a=find(a),b=find(b);
if(a!=b) fa[a]=b;
}
int dfs(int u,int flow)
{
if(u==t) return flow;
int a,v,cc=flow,minh=t;
for(v=;v<=t;v++)
{
if(c[u][v])
{
if(h[v]==h[u]-)
{
a=min(c[u][v],flow);
a=dfs(v,a);
c[u][v]-=a;
cc-=a;
c[v][u]+=a;
if(h[s]>t) return flow-cc;
if(!cc) break;
}
minh=min(minh,h[v]);
}
}
if(cc==flow)
{
if(--gap[h[u]]==) h[s]=t+;
++gap[h[u]=minh+];
}
return flow-cc;
}
int isap()
{
memset(gap,,sizeof(gap));
memset(h,,sizeof(h));
int ans=;gap[]=t+;
while(h[s]<=t)
ans+=dfs(s,INF);
return ans;
}
int bin()
{
int l=,r=n,mid,i,j,ans;
while(l<=r)
{
mid=(l+r)>>;
for(i=;i<=n;i++)
c[s][i]=mid,c[i+n][t]=mid;
for(i=;i<=n;i++)
for(j=n+;j<=n+n;j++)
c[i][j]=tmpc[i][j];
if(mid*n==isap())
{
ans=mid;
l=mid+;
}
else
r=mid-;
}
return ans;
}
int main()
{
int T,m,k,i,j,x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(c,,sizeof(c));
s=,t=n*+;
for(i=;i<=n;i++)
fa[i]=i;
while(m--)
{
scanf("%d%d",&x,&y);
c[x][y+n]=;
}
while(k--)
{
scanf("%d%d",&x,&y);
union_(x,y);
for(i=;i<=n;i++)
{
if(find(i)==find(x))
{
for(j=n+;j<=n+n;j++)
{
if(c[i][j]&&!c[x][j])
c[x][j]=;
}
}
if(find(i)==find(y))
{
for(j=n+;j<=n+n;j++)
{
if(c[i][j]&&!c[y][j])
c[y][j]=;
}
}
}
}
for(i=;i<=n;i++) for(j=n+;j<=n+n;j++) tmpc[i][j]=c[i][j];
printf("%d\n",bin());
}
return ;
}

HDU 3081 最大流+并查集的更多相关文章

  1. Marriage Match II 【HDU - 3081】【并查集+二分答案+最大流】

    题目链接 一开始是想不断的把边插进去,然后再去考虑我们每次都加进去边权为1的边,直到跑到第几次就没法继续跑下去的这样的思路,果不其然的T了. 然后,就是想办法咯,就想到了二分答案. 首先,我们一开始处 ...

  2. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  3. hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

    hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...

  4. HDU 3081 最大流+二分

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

  5. <hdu - 1232> 畅通工程 并查集问题 (注意中的细节)

    本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232  结题思路:因为题目是汉语的,那我就不解释题意了,要求的是最少建设的道路,我们可以用并查集来做这 ...

  6. HDU 5441 Travel(并查集+统计节点个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...

  7. HDU 4313 Matrix(并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意: 给出一棵树,每条边都有权值,其中有几个点是特殊点,现在破坏边还使得这几个特殊点互相不可达,需要使得 ...

  8. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  9. HDU 3018 Ant Trip (并查集求连通块数+欧拉回路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目大意:有n个点,m条边,人们希望走完所有的路,且每条道路只能走一遍.至少要将人们分成几组. ...

随机推荐

  1. c#泛型方法返回null的问题

    c#的泛型方法实现和java实现有点不同,在java中,所有的泛型方法运行时类型必须是引用类型,所以和非泛型一样可以返回null. 但是c#中有点不同,可以同时是值类型和引用类型,而值类型不能赋值nu ...

  2. www.97top10.com--做最好的技术交流网站

    www.97top10.com--做最好的技术交流网站

  3. Android按钮的四种点击事件

    本文记录一下按钮的四种点击事件 第一种 public class MainActivity extends Activity { @Override protected void onCreate(B ...

  4. 基础学习day10--异常、包

    一.异常 1.1.异常定义 异常:--不正常,程序在运行时出现不正常情况 异常由来:其实也是现实生活中一个具体的事物,马可以通过JAVA的类的形式表现描述,并封装成类. Java对不正常情况描述后的, ...

  5. SSH整合简述一

    1.web.xml中配置 struts2过滤器 <filter> <filter-name>struts2</filter-name> <filter-cla ...

  6. 全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程

    在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片 ...

  7. 再也不用管UIImagePicker的代理了

    EasyImagePicker 闲暇之余对UIImagePicker做了封装,将代理调用的方式封装成block回调的方式,这样一行代码就能够搞定UIImagePicker的使用,包括选择图片,取消选择 ...

  8. clang: error: no such file or directory: xxx.pch

    今天打开一个下载的例子 报clang: error: no such file or directory: xxx.pch的错 说一下解决方案 1.先在你的工程里找到这.pch文件- 2.把它现在的路 ...

  9. 配置JDK环境变量

    •配置JDK环境变量<Windows系统下> 点击我的电脑右键----->属性------>高级------>环境变量------->  新建(建议在系统变量中新建 ...

  10. C++中的常量折叠

    先看例子: #include <iostream> using namespace std; int main() { ; int * p = (int *)(&a); *p = ...