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: ...
随机推荐
- soj1090.Highways
1090. Highways Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description The island nation of ...
- 在Emacs中画思维导图
是的,你没有看错.其实,不只画思维导图,画结构图.流程图等,都可以.那怎么办呢?就是借助 Graphviz . Graphviz 可以方便地表达概念之间的联系,因此用它画思维导图是可行的,再加上它是个 ...
- 让老版本IE支持HTML5
一直想入手C3和H5,但因为所开发的项目一直要求兼容IE7,IE8.而这两个浏览器并不支持html5,所以一直都在观望而未真正的投入太多精力去学习.尽管我知道h5和c3是主流. 在最近的项目开发中,偶 ...
- Djangoform表单Ajax控制跳转
需求: 1:在登陆页面输入账号密码后,ajax异步提交数据给后端验证. 2:验证通过后,后端指定跳转页面,并把页面封装进返回的Json数据中,由ajax控制from表单跳转到目标页面 一:登陆页面HT ...
- JS踩过的坑
一:DOM对象的查找 DOM的查找到的对象,除byID的之外,返回的都是一个数组,并不是DOM对象无法调用DOM对象的方法. 通过id查找: 因为id在一个HTML文件中唯一,因此查找到的只会是一个元 ...
- 【SLAM】安装 g2o_viewer
2017年2月8日,那是一个阴天.为了完成高翔博士的<一起做RGB-D SLAM>教程,我在 Ubuntu 14.04 安装 g2o.遇到困难,怎奈我眼瞎,找错了方向,浪费时间,没有成功安 ...
- 【HASPDOG】hasp_update参数f和i区别
[root@BICServer-TX shared]# ./hasp_update This is a simple demo program for the Sentinel Update and ...
- http请求与传参
这并不算是文章,暂时只做粗略地记录,以免忘记,因此会显得杂乱无章,随便抓了几个包和对postman截图,日后有空再完善 1.get方式 只有一种方式,那就是在url后面跟参数 2.post方式 1)表 ...
- 线性表应用--Josephus问题的解法(Python 版)
线性表应用 --Josephus问题的解法(Python 版) Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出.然后从下一个人开始继续报数并按照相同的 ...
- mac搭建lamp环境
转载:https://www.cnblogs.com/beautiful-code/p/7465320.html