题目: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 并查集 二分图的更多相关文章

  1. 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 ...

  2. hdu 3081(二分+并查集+最大流||二分图匹配)

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

  3. HDU 2818 (矢量并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...

  4. hdu 1116 欧拉回路+并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...

  5. B. Mr. Kitayuta's Colorful Graph,二维并查集,一个简单变形就可以水过了~~

    B. Mr. Kitayuta's Colorful Graph ->  Link  <- 题目链接在上面,题目比较长,就不贴出来了,不过这是道很好的题,很多方法都可以做,真心邀请去A了这 ...

  6. 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 ...

  7. hdu 3536【并查集】

    hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市.  Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...

  8. HDU 1829 分组并查集

    题意:有两种性别,每组数据表示是男女朋友,判断输入的几组数据是否有同性恋 思路:http://blog.csdn.net/iaccepted/article/details/24304087 分组并查 ...

  9. HDU 1198(并查集)

    题意:给你11个图,每一个都有管道,然后给一张由这11个正方形中的n个组成的图,判断有几条连通的管道: 思路:在大一暑假的时候做过这道题,当时是当暴力来做的,正解是并查集,需要进行一下转换: 转换1: ...

随机推荐

  1. 奇葩字符 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎" 的简单分析

    这个其实之前火过一阵子,当时也没怎么注意,今天看到空间里又有人在刷这个字符了,所以决定分析下他是什么东西.复制这个字符在控制台查看 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".l ...

  2. soj1049.Mondriaan

    1049. Mondriaan Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Squares and rectangl ...

  3. 10 款非常棒的CSS代码格式化工具推荐

    如果你刚开始学习CSS,这意味着你的很多代码或结构可能需要优化,比如你可能过多使用了类.添加了多余的间隔或空行等等,这将导致代码臃肿.混乱,可读性和执行效率将大大降低. 本文为你整理了几款CSS工具, ...

  4. Android 实现两个list分别出现(在某一时刻只出现一个控件)

    第一种方法: 在.xml文件中将这两个List分别放入不同的布局管理器中,比如说 <RelativeLayout android:layout_width="match_parent& ...

  5. 【Codeforces858F】Wizard's Tour [构造]

    Wizard's Tour Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 5 1 2 ...

  6. 20155307 2016-2017-2 《Java程序设计》第5周学习总结

    20155307 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 这两章主要讲的是如何处理程序中的异常情况,对于错误,java会将其打包成对象,可以用&quo ...

  7. 20155117王震宇实验四 Andoid开发基础实验报告

    实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: - ...

  8. Go语言的接口interface、struct和组合、继承

    Go语言的interface概念相对于C++中的基类,通过interface来实现多态功能. 在C++中,当需要实现多态功能时,步骤是首先定义一个基类,该基类使用虚函数或者纯虚函数抽象了所有子类会用到 ...

  9. 2016.07.13-vector<vector<int>>应用2——Two Sum扩展

    收获: vector<vector<int> >res,不能直接用res[j].push_back(number),因为res[j]是空的,没有初始化 可以先定义 vector ...

  10. 再战CS231-快速排序

    1.用python实现快速排序 print quicksort([3,6,8,10,1,2,1]) # Prints "[1, 1, 2, 3, 6, 8, 10]" ''' @a ...