题目传送门

  1. /*
  2.   二分图点染色:这题就是将点分成两个集合就可以了,点染色用dfs做, 剩下的点放到点少的集合里去
  3. 官方解答:首先二分图可以分成两类点X和Y, 完全二分图的边数就是|X|*|Y|.我们的目的是max{|X|*|Y|}, 并且|X|+|Y|=n.
  4. 修正:实现多连通块染色,然后贪心选择,将两个集合个数差大的连通块优先添加,能尽量使得un*vn最大
  5. */
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <vector>
  10. #include <map>
  11. using namespace std;
  12. const int MAXN = 1e4 + ;
  13. const int MAXM = 1e5 + ;
  14. const int INF = 0x3f3f3f3f;
  15. vector<int> G[MAXN];
  16. int col[*MAXN];
  17. bool vis[MAXN];
  18. struct Block { //连通块
  19. int u, v;
  20. bool operator < (const Block &r) const {
  21. return u - v > r.u - r.v;
  22. }
  23. }b[MAXN];
  24. int n, m, un, vn;
  25. void DFS(int u, int c) {
  26. col[c]++; vis[u] = true;
  27. for (int i=; i<G[u].size (); ++i) {
  28. int v = G[u][i];
  29. if (vis[v]) continue;
  30. DFS (v, c ^ );
  31. }
  32. }
  33. int main(void) { //BestCoder 1st Anniversary($) 1004 Bipartite Graph
  34. //freopen ("D.in", "r", stdin);
  35. int T; scanf ("%d", &T);
  36. while (T--) {
  37. scanf ("%d%d", &n, &m);
  38. for (int i=; i<=n; ++i) G[i].clear ();
  39. for (int i=; i<=m; ++i) {
  40. int u, v; scanf ("%d%d", &u, &v);
  41. G[u].push_back (v); G[v].push_back (u);
  42. }
  43. int color = ;
  44. memset (vis, false, sizeof (vis));
  45. memset (col, , sizeof (col));
  46. for (int i=; i<=n; ++i) {
  47. if (vis[i]) continue;
  48. DFS (i, color); color += ;
  49. }
  50. int cnt = ;
  51. for (int i=; i<color; i+=) {
  52. b[++cnt].u = col[i]; b[cnt].v = col[i^];
  53. if (b[cnt].u < b[cnt].v) swap (b[cnt].u, b[cnt].v);
  54. }
  55. sort (b+, b++cnt);
  56. un = vn = ;
  57. for (int i=; i<=cnt; ++i) {
  58. if (un <= vn) {
  59. un += b[i].u; vn += b[i].v;
  60. }
  61. else {
  62. un += b[i].v; vn += b[i].u;
  63. }
  64. }
  65. printf ("%d\n", un * vn - m);
  66. }
  67. return ;
  68. }

二分图点染色 BestCoder 1st Anniversary($) 1004 Bipartite Graph的更多相关文章

  1. BestCoder 1st Anniversary 1004 Bipartite Graph 【二分图 + bfs + 良好的逻辑思维 】

    题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=610&pid=1004 问题描述 Soda有一个$ ...

  2. BestCoder 1st Anniversary

    Souvenir  Accepts: 1078  Submissions: 2366  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 26 ...

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

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

  4. hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

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

  5. BestCoder 1st Anniversary($) 1003 Sequence

    题目传送门 /* 官方题解: 这个题看上去是一个贪心, 但是这个贪心显然是错的. 事实上这道题目很简单, 先判断1个是否可以, 然后判断2个是否可以. 之后找到最小的k(k>2), 使得(m-k ...

  6. hdu 5311 Hidden String (BestCoder 1st Anniversary ($))(深搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS (Java/Others)  ...

  7. BestCoder 1st Anniversary ——HDU5312(数学推导)

    Today, Soda has learned a sequence whose n-th (n≥1) item is 3n(n−1)+1. Now he wants to know if an in ...

  8. HDU 5313——Bipartite Graph——————【二分图+dp+bitset优化】

    Bipartite Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP)

    [HDU5807] [BestCoder Round #86 1004] Keep In Touch (DP) 题面 有三个人从一张N个点无重边的有向无环图上的三个点出发,每单位时间,他们分别选择当前 ...

随机推荐

  1. iOS学习之C语言循环结构

    一.while循环    while (循环条件) {        循环体:    }    // 1.定义循环变量    int time = 1;    // 2.循环条件    while ( ...

  2. 安装Ubuntu 15.10后要做的事

    Ubuntu 15.10发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...

  3. 读取、添加、删除、修改配置文件 如(Web.config, App.config)

    private Configuration config; public OperateConfig() : this(HttpContext.Current.Request.ApplicationP ...

  4. 从浅到深掌握Oracle的锁

      1.分别模拟insert,update和delete造成阻塞的示例,并对v$lock中的相应的信息进行说明,给 出SQL演示. Insert示例 会话:SQL> select * from ...

  5. SpringMVC核心类DispatcherServlet

    配置DispatcherServlet 要使用SpringMVC,必须在web.xml中配置好这个DispatcherServlet类 <!-- spring框架必须定义ContextLoade ...

  6. FushionCharts Free 的运用[2D/3D图表处理]

    由于先前在一些论坛中谈论到这个插件的运用,留了一些QQ联系方式,最近老是被一些程序员“骚扰”,说是请教一些关于FushionChart Free图表的处理技术,先前还是比较乐意接受的,但发现后来一些完 ...

  7. Window.document对象(1)

    1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:     var a =docunme ...

  8. 计算器软件的代码实现 (策略模式+asp.net)

    一 策略模式代码的编写 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...

  9. Java多jdk安装

    1.安装jdk 2.配置 1.安装(略) 2.配置 2.1 regedit 注册表修改,假定已经安装jdk1.6,现在更换为jdk1.7 注: 修改红色框中CurrentVersion为jdk1.7 ...

  10. 【UOJ Easy Round #2】

    然而UER我也照样跪…… 第一题 忘了取模sad || 操作符将整个区间分成了一些段,每个手机只会执行其中某一段,执行次数为这一段中&&的个数?+1? ans=ans*num[i]+1 ...