HDU 3081 最大流+并查集
题意:有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 最大流+并查集的更多相关文章
- Marriage Match II 【HDU - 3081】【并查集+二分答案+最大流】
题目链接 一开始是想不断的把边插进去,然后再去考虑我们每次都加进去边权为1的边,直到跑到第几次就没法继续跑下去的这样的思路,果不其然的T了. 然后,就是想办法咯,就想到了二分答案. 首先,我们一开始处 ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- HDU 3081 最大流+二分
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- <hdu - 1232> 畅通工程 并查集问题 (注意中的细节)
本题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 结题思路:因为题目是汉语的,那我就不解释题意了,要求的是最少建设的道路,我们可以用并查集来做这 ...
- HDU 5441 Travel(并查集+统计节点个数)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给出一个图,每条边有一个距离,现在有多个询问,每个询问有一个距离值d,对于每一个询问,计算出有多少点 ...
- HDU 4313 Matrix(并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=4313 题意: 给出一棵树,每条边都有权值,其中有几个点是特殊点,现在破坏边还使得这几个特殊点互相不可达,需要使得 ...
- hdu 1558 (线段相交+并查集) Segment set
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...
- HDU 3018 Ant Trip (并查集求连通块数+欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题目大意:有n个点,m条边,人们希望走完所有的路,且每条道路只能走一遍.至少要将人们分成几组. ...
随机推荐
- [Architecture Design] 累进式Domain Layer
[Architecture Design] 累进式Domain Layer 前言 本篇的内容大幅度的简化了分析设计.面向对象等等相关知识,用以传达累进式Domain Layer的核心概念.实际开发软件 ...
- PHP写日志函数
初学,写一个函数用于存储日志调试. function WriteLog($msg) { $filename = dirname(__FILE__) ."\\Debug.log"; ...
- ready和onload
ready:jQuery方法,当DOM载入就绪时执行.(不包含图片等非文字媒体文件) 它可以极大地提高web应用程序的响应速度. 有一个参数--对jQuery函数的引用--会传递到这个ready事件处 ...
- Cent OS 6.4安装mysql
Cent OS6.4 RPM安装mysql 一.卸载掉原有mysql 因为目前主流Linux系统版本基本上都集成了mysql数据库在里面 如下命令来查看我们的操作系统上是否已经安装了mysql数据库 ...
- Eclipse环境下配置spket中ExtJS5.0提示
使用eclipse编写extjs时,一定会用到spket这个插件,spket可以单独当作ide使用,也可以当作eclipse插件使用,我这里是当作eclipse的插件使用的,下面来一步步图解说明如何配 ...
- CSS 相邻选择器(七)
一.相邻选择器 相邻选择器前后部分之间用一个加号(+)隔开,前后两部分选择反符在结构上属于同级关系,如 相邻选择器,是根据左侧选择符指定相邻元素,然后在该相邻元素后面寻找匹配匹配右侧选择符的相信元素 ...
- C++语言-02-函数
普通函数 C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集 C++中的普通函数与C语言中的普通函数具有类似的性质.请参照以下博客:C语言-04-函数 与类相关的函数 C是一种OOP语言 ...
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 捡火柴的Nova君(n个线段相交问题)
题目来源:https://biancheng.love/contest-ng/index.html#/41/problems 捡火柴的Nova君 题目描述 南方没暖气,怕冷的的宝宝们只能用火柴取暖.然 ...
- Effective Java 32 Use EnumSet instead of bit fields
Bit fields is used for passing around sets of constants. Such as // Bit field enumeration constants ...