题目大意:

添加尽可能少的边,最后使图形成二分图

一开始将图区分成一个个联通分量,根据二分图染色,计算出每个联通分量的黑色点和白色点的个数

希望添加的边最少,那么合并的时候,希望黑白块尽可能平均,这无疑背包dp做,但超时了。。。T T

跟着题解说的bitset,学了一下,果然总共10000个点不到,那么只要用bitset上的某一位代表取到的值即可- -,好神奇。。这里用的是或运算

 #include <cstdio>
 #include <cstring>
 #include <iostream>
 #include <map>
 #include <vector>
 #include <queue>
 #include <climits>
 #include <bitset>
 #include <algorithm>
 using namespace std;
 #define ls o<<1
 #define rs o<<1|1
 #define define_m int m=(l+r)>>1
 #define N 10010
 #define ll long long
 vector <int> vec[N];
 bitset<> bt;
 int n , m , u , v , id;
 int w[N] , b[N] ,col[N];

 void dfs(int u , int id)
 {
     if(col[u]) w[id]++;
     else b[id]++;
     int l = vec[u].size();
      ; i<l ; i++){
         int v = vec[u][i];
         ) continue;
         col[v] = col[u]^;
         dfs(v , id);
     }
 }

 void solve()
 {
     memset(b, ,sizeof(b));
     memset(w ,  , sizeof(w));
     memset(col , - , sizeof(col));
     id = ;
      ; i<=n ; i++){
         ){
             ++id;
             col[i] = ;
             dfs(i , id);
         }
     }
 }

 int cal()
 {
     bt[] = ;
      ; i<=id ; i++){
         bt = bt|(bt<<b[i])|(bt<<w[i]);
     }
     ;
      ; i<=n ; i++){
         if(bt[i]){
             if(abs(ans-ave)>abs(i-ave)) ans = i;
         }
     }
     return ans*(n-ans)-m;
 }

 int main()
 {
     //freopen("in.txt" , "r" , stdin);
     int T;
     scanf("%d" , &T);
     while(T--)
     {
         scanf("%d%d" , &n , &m);
          ; i<=n ; i++)vec[i].clear();
          ; i<m ; i++){
             scanf("%d%d" , &u , &v);
             vec[u].push_back(v);
             vec[v].push_back(u);
         }
         solve();
         printf("%d\n" , cal());
     }
     ;
 }

HDU 5313 bitset优化背包的更多相关文章

  1. hdu 5745 La Vie en rose DP + bitset优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5745 这题好劲爆啊.dp容易想,但是要bitset优化,就想不到了. 先放一个tle的dp.复杂度O(n * m ...

  2. hdu 5506 GT and set dfs+bitset优化

    GT and set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Probl ...

  3. HDU 5313 Bipartite Graph (二分图着色,dp)

    题意: Soda有一个n个点m条边的二分图, 他想要通过加边使得这张图变成一个边数最多的完全二分图. 于是他想要知道他最多能够新加多少条边. 注意重边是不允许的. 思路: 先将二分图着色,将每个连通分 ...

  4. HDU 5313 Bipartite Graph

    题意:给一个二分图,问想让二分图变成完全二分图最多能加多少条边. 解法:图染色+dp+bitset优化.设最终的完全二分图两部分点集为A和B,A中点个数为x,B中点个数为y,边数则为x × y,答案即 ...

  5. hdu 2546 典型01背包

    分析:每种菜仅仅可以购买一次,但是低于5元不可消费,求剩余金额的最小值问题..其实也就是最接近5元(>=5)时, 购买还没有买过的蔡中最大值问题,当然还有一些临界情况 1.当余额充足时,可以随意 ...

  6. HDU 3127 WHUgirls(完全背包)

    HDU 3127 WHUgirls(完全背包) http://acm.hdu.edu.cn/showproblem.php? pid=3127 题意: 如今有一块X*Y的矩形布条, 然后有n种规格的x ...

  7. hdu_5036_Explosion(bitset优化传递闭包)

    题目链接:hdu_5036_Explosion 题意: 一个人要打开或者用炸弹砸开所有的门,每个门里面有一些钥匙,一个钥匙对应一个门,有了一个门的钥匙就能打开相应的门,告诉每个门里面有哪些门的钥匙,问 ...

  8. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  9. HDU 1561 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1561 题目大意:从树根开始取点.最多取m个点,问最大价值. 解题思路: cost=1的树形背包. 有 ...

随机推荐

  1. CSS学习笔记2-2d变换和过渡属性

    前言:今天又是一个周末,心情不错,趁着闲暇之余,把剩下来的CSS3学习的内容全部整理出来,练习用的源码也稍微整理了一下. 2D转换 transform:translate||rotate||scale ...

  2. Java 链表

    按链表的组织形式分有ArrayList和LinkList两种.ArrayList内部其实是用数组的形式实现链表,比较适合链表大小确定或较少对链表进行增删操作的情况,同时对每个链表节点的访问时间都是co ...

  3. 自适应css 框架 PURE

    Bootstrap 好用 但是太大啦 有时候只需要用到媒体查询这一块的样式 Pure.css可以很好地替代 直接上地址咯: http://purecss.io/ https://unpkg.com/p ...

  4. IE6的连接数限制问题

    今天解决了一个bug.看似是UI的bug,最后发现IE的设置问题(严格来说,IE6这么做没有问题,因为HTTP协议的规范如此). 先描述一下问题: 有一个页面管理Job,选中一些Job可以Run,每次 ...

  5. (转)rlwrap真是一个好东西

    在Linux下面使用sqlplus很不爽,上下键,退格键都不能用,严重降低生产效率. 某一天终于发现了这个rlwrap这个好东西,特写此文记录. 下载地址如下: http://utopia.knowa ...

  6. iOS开发--Swift 如何完成工程中Swift和OC的混编桥接(Cocoapods同样适用)

    由于SDK现在大部分都是OC版本, 所以假如你是一名主要以Swift语言进行开发的开发者, 就要面临如何让OC和Swift兼容在一个工程中, 如果你没有进行过这样的操作, 会感觉异常的茫然, 不用担心 ...

  7. UIScrollView之轮转图片

    在iOS开发中,经常会在APP首页看到多张图片进行轮换.刚开始做的时候,感觉很麻烦,不是很好做,查阅资料后,我总结了一下,自己封装了一个简单的轮转图片库: UIScrollView无限滑动 ,只需要三 ...

  8. 如何解决Windows 10系统下设备的声音问题

    如何解决Windows 10系统下设备的声音问题? 请阅读下面的说明来解决Windows 10设备上的声音问题. 1. 检查设备管理器 打开开始菜单,键入设备管理器, 从出现的结果中选择并打开它. 在 ...

  9. Windows下安装node

    1.安装node及npm Windows下安装软件都是傻瓜式安装,首先登陆官网(https://nodejs.org/en/)下载对应的node程序,然后双击进行安装.安装过程基本上是点击'Next' ...

  10. Eclipse颜色主题插件:Eclipse Color Theme

    一个很赞的eclipse插件,可以简单方便地实现eclipse下的代码配色.另外插件作者还专门为此插件做了一个eclipse配色网站,配色多达728个,开发者们也可以在此网站分享自己的配色方案. 插件 ...