首先就是求联通块,每个联通块里记录两个部分的元素个数

目标是使一边的体积接近n/2

那么每个联通块作为一组,进行分组背包,dp[i]表示体积i是否可以被凑出来,可行性背包是可以用bitset优化的

最后找最接近n/2的体积即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define maxn 10005
  4. #define maxm 100005
  5. int n,m,cnt,vis[maxn];
  6. struct Node{int a,b;}p[maxn];
  7. vector<int>G[maxn];
  8.  
  9. void dfs(int u,int c){
  10. vis[u]=;
  11. if(c==)p[cnt].a++;
  12. else p[cnt].b++;
  13. for(int i=;i<G[u].size();i++){
  14. int v=G[u][i];
  15. if(vis[v])continue;
  16. dfs(v,!c);
  17. }
  18. }
  19.  
  20. int main(){
  21. int t;cin>>t;
  22. while(t--){
  23. memset(p,,sizeof p);
  24.  
  25. scanf("%d%d",&n,&m);
  26. for(int i=;i<=n;i++)G[i].clear();
  27. for(int i=;i<=m;i++){
  28. int u,v;
  29. scanf("%d%d",&u,&v);
  30. G[u].push_back(v);
  31. G[v].push_back(u);
  32. }
  33.  
  34. //求出联通块
  35. cnt=;
  36. memset(vis,,sizeof vis);
  37. for(int i=;i<=n;i++)
  38. if(!vis[i]){
  39. ++cnt;
  40. dfs(i,);
  41. }
  42.  
  43. bitset<>dp;
  44. dp.reset();
  45. dp[]=;
  46. for(int i=;i<=cnt;i++)//从每组里找一个
  47. dp=(dp<<p[i].a)|(dp<<p[i].b);
  48.  
  49. long long ans=;
  50. for(int i=;i<n;i++)
  51. if(dp[i])
  52. ans=max(ans,(long long)(n-i)*i-m);
  53. cout<<ans<<'\n';
  54. }
  55. return ;
  56. }

二分图染色+分组背包+bitset优化——hdu5313的更多相关文章

  1. 01二维背包+bitset优化——hdu5890

    口胡一种别的解法: 三重退背包,g1[j]k]表示不选x的选了j件物品,体积为k的方案数,g[0][0] = 1 , g1[j][k]=dp[j][k]-g1[j-1][k-a[x]] 然后按这样再退 ...

  2. HDU 5313 Bipartite Graph(二分图染色+01背包水过)

    Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants ...

  3. Hdu 6268 点分治 树上背包 bitset 优化

    给你一颗大小为n(3000)的树,树上每个点有点权(100000),再给你一个数m(100000) i为1~m,问树中是否存在一个子图,使得权值为i. 每次solve到一个节点 用一个bitset维护 ...

  4. HDU 5313 bitset优化背包

    题目大意: 添加尽可能少的边,最后使图形成二分图 一开始将图区分成一个个联通分量,根据二分图染色,计算出每个联通分量的黑色点和白色点的个数 希望添加的边最少,那么合并的时候,希望黑白块尽可能平均,这无 ...

  5. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  6. HDU - 6268: Master of Subgraph (分治+bitset优化背包)

    题意:T组样例,给次给出一个N节点的点权树,以及M,问连通块的点权和sum的情况,输出sum=1到M,用0或者1表示. 思路:背包,N^2,由于是无向的连通块,所以可以用分治优化到NlgN. 然后背包 ...

  7. poj 1742 Coins(二进制拆分+bitset优化多重背包)

    \(Coins\) \(solution:\) 这道题很短,开门见山,很明显的告诉了读者这是一道多重背包.但是这道题的数据范围很不友好,它不允许我们直接将这一题当做01背包去做.于是我们得想一想优化. ...

  8. HDU5890:Eighty seven(Bitset优化背包)

    Mr. Fib is a mathematics teacher of a primary school. In the next lesson, he is planning to teach ch ...

  9. HDU 5808 Price List Strike Back bitset优化的背包。。水过去了

    http://acm.hdu.edu.cn/showproblem.php?pid=5808 用bitset<120>dp,表示dp[0] = true,表示0出现过,dp[100] = ...

随机推荐

  1. Laravel groupBy用法

    // 假设model名是News:status启用是1:language选择cn: $data = News::select(array('id', 'title', 'type')) ->wh ...

  2. swiper轮播箭头垂直居中

    取消懒加载 for (var i in $('.p01-s9 .lazyload')) { $('.p01-s9 .lazyload').eq(i).attr('src',$('.p01-s9 .la ...

  3. 分治维护dp——19南昌网络赛C/cf750E

    南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...

  4. 管理员技术(四): 配置NTP网络时间客户端、 创建一个备份包、 配置用户和组账号、配置一个cron任务

    一. 配置NTP网络时间客户端 目标: 本例要求配置虚拟机 server0,能够自动校对系统时间.相关信息如下: 1> NTP服务器位于 classroom.example.com        ...

  5. 收集python2代码转python3遇到的问题

    在程序中做python版本判断 sys.version_info # sys.version_info(major=2, minor=7, micro=16, releaselevel='final' ...

  6. STM32嵌入式开发学习笔记(六):串口通信(上)

    本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...

  7. windows 驱动开发 DDK与WDK WDM的区别

    1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发W ...

  8. Linux关闭端口

    1.  查看哪些端口被占用 $ netstat -anp | grep 2042 tcp 0 0 192.168.56.1:2042 0.0.0.0:* LISTEN 8974/python 2. 删 ...

  9. PAT_A1130#Infix Expression

    Source: PAT A1130 Infix Expression (25 分) Description: Given a syntax tree (binary), you are suppose ...

  10. mysql中explain详解

    explain语法 有两种用法: 1.EXPLAIN tbl_name    2.EXPLAIN [EXTENDED] SELECT select_options 为了更好的说明它,我们需要建两张表, ...