Bipartite Graph hdu 5313 bitset 并查集 二分图
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313
题意:
给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图
存储结构:
bitset 【用法详情:http://blog.csdn.net/piaocoder/article/details/47177891】
用时:624ms
思路:
二分图的总边数即:n*m(假设一个有n个点,另一个有m个点)
题目是给出总共的点数为n,间接求最大的边数
想到一个小学题:给出长度为n的绳子,将其分为两截,使以这两截长度作为长和宽的矩形面积最大,当然,就是平分喽
虽然,此题不一定和小学题一模一样,但是要想使得分出的n和m乘积最大,必须使n和m尽可能相近,没问题吧。
然后我们用一个并查集先分出各个连通图,再做相应的处理即可,详见注释
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
const int v_N = ; //总结点数
bitset<v_N> Bit; //允许多少条边构成一个集合,比如:允许一个点构成一个集合,那么Bit[1]为真,否则为假
int n, m, group, fa[v_N], color[v_N], part_num[v_N][];
//fa:父亲; color:染色 part_num:同一个集合(并查集得到)中各个颜色所拥有的结点个数
int find(int x)
{
if (x == fa[x])
return x;
int t = fa[x];
fa[x] = find(fa[x]);
color[x] ^= color[t]; //当前与父亲异或,刷新颜色
return fa[x];
}
void solve()
{
for (int i = ; i <= n; ++i)
Bit[i] = ;
Bit[] = ;
for (int i = ; i <= n; ++i) //统计
part_num[find(i)][color[i]]++;
for (int i = ; i <= n; ++i)
if (i == fa[i]) //说明一个集合结束了,刷新Bit
Bit = (Bit << part_num[i][]) | (Bit << part_num[i][]);
int _max = ;
for (int i = n / - ; i <= n / + ; ++i) //遍历半数左右即可!! 剪枝
if (Bit[i])
_max = max(_max, i*(n - i) - m);
printf("%d\n", _max);
} int main()
{
scanf("%d", &group);
while (group--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i)
fa[i] = i, color[i] = part_num[i][] = part_num[i][] = ;
for (int i = ; i < m; ++i)
{
int x, y, fx, fy;
scanf("%d%d", &x, &y);
fx = find(x), fy = find(y);
if (fx == fy)
continue;
fa[fx] = fy;
color[fx] = ^ color[x] ^ color[y]; //保证同一条边或不同一集合颜色不同,初始为0,所以用1异或
}
solve();
}
}
感谢您的阅读,生活愉快~
Bipartite Graph hdu 5313 bitset 并查集 二分图的更多相关文章
- B - Rikka with Graph HDU - 5631 (并查集+思维)
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...
- hdu 3081(二分+并查集+最大流||二分图匹配)
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 2818 (矢量并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...
- hdu 1116 欧拉回路+并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...
- B. Mr. Kitayuta's Colorful Graph,二维并查集,一个简单变形就可以水过了~~
B. Mr. Kitayuta's Colorful Graph -> Link <- 题目链接在上面,题目比较长,就不贴出来了,不过这是道很好的题,很多方法都可以做,真心邀请去A了这 ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...
- hdu 3536【并查集】
hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市. Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...
- HDU 1829 分组并查集
题意:有两种性别,每组数据表示是男女朋友,判断输入的几组数据是否有同性恋 思路:http://blog.csdn.net/iaccepted/article/details/24304087 分组并查 ...
- HDU 1198(并查集)
题意:给你11个图,每一个都有管道,然后给一张由这11个正方形中的n个组成的图,判断有几条连通的管道: 思路:在大一暑假的时候做过这道题,当时是当暴力来做的,正解是并查集,需要进行一下转换: 转换1: ...
随机推荐
- 全解析jQuery插件开发!很好很强大!
最近对JQuery插件开发超级感兴趣,看到这样一篇好文章,可以说是<用实例一步步教你写Jquery插件>的十全大补,大家可以两篇结合着看看! jQuery插件的开发包括两种: 一种是类级别 ...
- [php]mysql操作流程
这种是比较老的一种mysql连接方法 1.连接数据库 $this->con = mysql_connect($this->host, $this->user, $this->p ...
- Vue的生命周期的介绍
[推荐链接] https://segmentfault.com/a/1190000008010666
- 函数嵌套>作用域>闭包函数
一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...
- git 放弃本地修改操作
如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout ...
- Python标准库笔记(7) — copy模块
copy-对象拷贝模块:提供了浅拷贝和深拷贝复制对象的功能, 分别对应模块中的两个函数 copy() 和 deepcopy(). 1.浅拷贝(Shallow Copies) copy() 创建的 浅拷 ...
- python几种装饰器的用法
用函数装饰函数 这种比较常见首先定义装饰器函数 def cache(func): data = {} @wraps(func) def wrapper(*args, **kwargs): key = ...
- Asp.Net使用百度编辑器(ueditor)
1. 1.4.3以上版本将不再承诺支持ie6/ie7. 2.如果是aspx 需要加上 ValidateRequest="false" 3.Web.config <syst ...
- 数据库-mysql索引
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...
- jenkins打包安卓项目
jenkins打包安卓项目和其它项目差不了太多. 1.构建选择 gradle(如果不用gradle自己写脚本编译也可) 2.jenkins用户需要安装JDK.SDK,jenkins会自动下载gradl ...