题意:有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识。如果可以分成两部分,就算出房间最多需要多少间,否则就输出No。

首先判断是否为二分图,然后判断最大匹配

Sample Input

  1. 4 4
  2. 1 2
  3. 1 3
  4. 1 4
  5. 2 3
  6. 6 5
  7. 1 2
  8. 1 3
  9. 1 4
  10. 2 5
  11. 3 6
    Sample Output
  1. No
  2. 3
  1. #include<iostream>
  2. #include<string.h>
  3. #include<vector>
  4. #include<cstdio>
  5. using namespace std;
  6. #define MAXN 202
  7. vector<int>EV[MAXN];
  8. int linker[MAXN];
  9. bool used[MAXN];
  10. int uN;
  11. int matchs[MAXN],cnt[MAXN];
  12. bool dfs(int u)
  13. {
  14. int i;
  15. for(i=;i<EV[u].size();i++)
  16. {
  17. int v=EV[u][i];
  18. if(!used[v])
  19. {
  20. used[v]=true;
  21. if(linker[v]==-||dfs(linker[v]))
  22. {
  23. linker[v]=u;
  24. return true;
  25. }
  26. }
  27. }
  28. return false;
  29. }
  30. int hungary()
  31. {
  32. int res=;
  33. int u;
  34. memset(linker,-,sizeof(linker));
  35. for(u=;u<=uN;u++)
  36. {
  37. memset(used,false,sizeof(used));
  38. if(dfs(u)) res++;
  39. }
  40. return res;
  41. }
  42. bool judge(int x,int y) //交叉染色法判断二分图
  43. {
  44. int i;
  45. for(i=;i<EV[x].size();i++)
  46. {
  47. if(cnt[EV[x][i]]==)
  48. {
  49. cnt[EV[x][i]]=-*y;
  50. matchs[EV[x][i]]=true;
  51. if(!judge(EV[x][i],-*y)) return false;
  52. }
  53. else if(cnt[EV[x][i]]==y) return false;
  54. }
  55. return true;
  56. }
  57. bool matched()
  58. {
  59. int i;
  60. memset(matchs,false,sizeof(matchs));
  61. for(i=;i<=uN;i++)
  62. {
  63. if(EV[i].size()&&!matchs[i])
  64. {
  65. memset(cnt,,sizeof(cnt));
  66. cnt[i]=-;
  67. matchs[i]=true;
  68. if(!judge(i,-)) return false;
  69. }
  70. }
  71. return true;
  72. }
  73. int main()
  74. {
  75. int m;
  76. int i;
  77. int u,v;
  78. while(scanf("%d%d",&uN,&m)!=EOF)
  79. {
  80. for(i=;i<=uN;i++)
  81. if(EV[i].size()) EV[i].clear();
  82. while(m--)
  83. {
  84. scanf("%d%d",&u,&v);
  85. EV[u].push_back(v);
  86. EV[v].push_back(u);
  87. }
  88.  
  89. if(matched())
  90. printf("%d\n",hungary()/);
  91. else printf("No\n");
  92. }
  93. return ;
  94. }

hdu 2444 二分图判断与最大匹配的更多相关文章

  1. HDU 2444 二分图判断 (BFS染色)+【匈牙利】

    <题目链接> 题目大意: 有N个人,M组互相认识关系互相认识的两人分别为a,b,将所有人划分为两组,使同一组内任何两人互不认识,之后将两个组中互相认识的人安排在一个房间,如果出现单人的情况 ...

  2. HDU - 2444 二分图最大匹配 之 判断二分图+匈牙利算法

    题意:第一行给出数字n个学生,m条关系,关系表示a与b认识,判断给定数据是否可以构成二分图,如果可以,要两个互相认识的人住一个房间,问最大匹配数(也就是房间需要的最小数量) 思路:要看是否可以构成二分 ...

  3. The Accomodation of Students HDU - 2444 二分图判定 + 二分图最大匹配 即二分图-安排房间

    /*655.二分图-安排房间 (10分)C时间限制:3000 毫秒 |  C内存限制:3000 Kb题目内容: 有一群学生,他们之间有的认识有的不认识.现在要求把学生分成2组,其中同一个组的人相互不认 ...

  4. hdu 2444(二分图) The Accomodation of Students

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 大意是给定n个学生,他们之间可能互相认识,首先判断能不能将这些学生分为两组,使组内学生不认识: 现想将学生 ...

  5. hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS     Me ...

  6. HDU 2444 The Accomodation of Students 二分图判定+最大匹配

    题目来源:HDU 2444 The Accomodation of Students 题意:n个人能否够分成2组 每组的人不能相互认识 就是二分图判定 能够分成2组 每组选一个2个人认识能够去一个双人 ...

  7. hdu 4751 2013南京赛区网络赛 二分图判断 **

    和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 #include<cstdio> #include<iostre ...

  8. hdu 5727 二分图+环排列

    Necklace Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  9. HDU 2444 The Accomodation of Students (偶图判定,匈牙利算法)

    题意: 有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是 ...

随机推荐

  1. GTP V0 和 GTP V1

    GTP概述 GTP(GPRS Tunnelling Protocol)协议应用在SGSN 和GGSN 之间,为各个移动台(MS) 建立GTP 通道,GTP 通道是 GPRS服务节点(GSN) 之间的安 ...

  2. 如何调试R程序(转载)

    R语言的调试重要性不言而喻,这段时间准备改进一个R的包,但由于接触R时间不长,中间的很多东西不懂,需要重新打包调试,以对里面的很多程序有深入了解,下面从几个方面分享一下我的收获. 1.准备工作 a)R ...

  3. codeforces 258div2 B Sort the Array

    题目链接:http://codeforces.com/contest/451/problem/B 解题报告:给出一个序列,要你判断这个序列能不能通过将其中某个子序列翻转使其成为升序的序列. 我的做法有 ...

  4. Linux下使用fdisk扩展分区容量

    导读 我们管理的服务器可能会随着业务量的不断增长造成磁盘空间不足的情况,比如:共享文件服务器硬盘空间不足,在这个时候我们就需要增加磁盘空间,来满足线上的业务:又或者我们在使用linux的过程中, 有时 ...

  5. Ubuntu 16.04 安装 VMware-Workstation-12

    以前一直使用 Ubuntu + Virtaulbox ,最近测试了 VMware-Workstation-9,性能超过 Virtaulbox-4.2.x,下面是详细步骤: 1 首先准备一个Ubuntu ...

  6. 如何使用setup.py文件

    setup.py文件的使用:% python setup.py build #编译% python setup.py install    #安装% python setup.py sdist     ...

  7. 【leetcode】Binary Search Tree Iterator

    Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Your iterator wil ...

  8. POJ 2418

    http://poj.org/problem?id=2418 这是一个二叉树的题目,但我看了下书,还是不是特别理解会用二叉树,所以我就用其他的办法来做,结果一样AC,时间也就1700多ms,比起二叉树 ...

  9. operator new3种情况详解

    [本文链接] http://www.cnblogs.com/hellogiser/p/operator-new.html [代码]  C++ Code  12345678910111213141516 ...

  10. 17.把字符串转换成整数[atoi]

    [题目] 把字符串转换成整数,需要考虑字符串有效性. [代码]  C++ Code  123456789101112131415161718192021222324252627282930313233 ...