http://acm.hdu.edu.cn/showproblem.php?pid=5285

题意:把互不认识的人分到两个组,第一组人数尽可能多。

题解:把互不认识的人连起来,当作二分图,二分图可能有多个,对于没有连线的点,扔到第一个图里。二色法对每个二分图染色,记录每个图比较多的颜色的数量累计到答案里。

特判坑:n<=1 或者 m==0

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<math.h>
  6. #include<string>
  7. #include<map>
  8. #include<queue>
  9. #include<stack>
  10. #include<set>
  11. #define ll long long
  12. #define inf 0x3f3f3f3f
  13. using namespace std;
  14.  
  15. int n,m;
  16.  
  17. vector<int>a[];
  18. int color[];
  19. int zero,one;
  20. int minn,maxx;
  21. bool flag;
  22.  
  23. void bfs(int x)
  24. {
  25. queue<int>que;///对x点进行广搜,二色法,一个标记为0,另一个标记为1
  26. zero=one=;
  27. zero++;
  28. que.push(x);
  29. color[x]=;
  30. while(!que.empty()&&flag)
  31. {
  32. int now=que.front();
  33. que.pop();
  34. int c=color[now];
  35. int len=a[now].size();
  36. for(int i=;i<len;i++)
  37. {
  38. int next=a[now][i];
  39. if(color[next]==-)///如果没有被染色过,
  40. {
  41. que.push(next);
  42. if(c==)
  43. color[next]=,one++;
  44. else
  45. color[next]=,zero++;
  46. }
  47. else ///被染色过
  48. {
  49. if( color[next]==c )
  50. {
  51. flag=false;
  52. break;
  53. }
  54. }
  55. }
  56.  
  57. }
  58. }
  59.  
  60. int main()//hdu5285
  61. {
  62. int t;
  63. scanf("%d",&t);
  64. while(t--)
  65. {
  66.  
  67. scanf("%d%d",&n,&m);
  68.  
  69. for(int i=;i<=n;i++)
  70. a[i].clear();
  71. memset(color,-,sizeof(color));
  72. minn=maxx=;
  73. flag=true;
  74.  
  75. if(n<=)
  76. {
  77. printf("Poor wyh\n");
  78. continue;
  79. }
  80. if(m==)///特判,否则全部染成0色
  81. {
  82. printf("%d 1\n",n-);
  83. continue;
  84. }
  85.  
  86. while(m--)
  87. {
  88. int u,v;
  89. scanf("%d%d",&u,&v);
  90. a[u].push_back(v);
  91. a[v].push_back(u);
  92. }
  93. int no=;///没有被染色的点,其中第一组尽量多,则把没有染色的加到多的那一边去
  94. for(int i=;i<=n && flag;i++)
  95. {
  96.  
  97. if(color[i]==- && a[i].size() )///没有被染色的点 并且 不是独立的
  98. {
  99. bfs(i);
  100. if(zero<one)
  101. swap(zero,one);
  102. maxx+=zero;
  103. minn+=one;
  104. }
  105. else if(color[i]==- && a[i].size()==)///独立的点染成颜色0,0是第一组,较多的那一组
  106. {
  107. color[i]=;
  108. maxx++;
  109. }
  110. }
  111. if(flag)
  112. printf("%d %d\n",maxx,minn);
  113. else
  114. printf("Poor wyh\n");
  115. }
  116.  
  117. return ;
  118. }

hdu5285-wyh2000 and pupil-(染色法二分图判定)的更多相关文章

  1. 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil

    题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...

  2. HDU 5285 wyh2000 and pupil 判二分图+贪心

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5285 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  3. Wrestling Match---hdu5971(2016CCPC大连 染色法判断是否是二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5971 题意:有n个人,编号为1-n, 已知X个人是good,Y个人是bad,m场比赛,每场比赛都有一个 ...

  4. 染色法判断是否是二分图 hdu2444

    用染色法判断二分图是这样进行的,随便选择一个点, 1.把它染成黑色,然后将它相邻的点染成白色,然后入队列 2.出队列,与这个点相邻的点染成相反的颜色 根据二分图的特性,相同集合内的点颜色是相同的,即 ...

  5. hdu 2444(染色法判断二分图+最大匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. poj 2942 Knights of the Round Table(点双连通分量+二分图判定)

    题目链接:http://poj.org/problem?id=2942 题意:n个骑士要举行圆桌会议,但是有些骑士相互仇视,必须满足以下两个条件才能举行: (1)任何两个互相仇视的骑士不能相邻,每个骑 ...

  7. HDU 5285 wyh2000 and pupil(dfs或种类并查集)

    wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Other ...

  8. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  9. HDU 2444:The Accomodation of Students(二分图判定+匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2444 题意:给出边,判断这个是否是一个二分图,并求最大匹配. 思路:先染色法求出是否是一个二分图,然后再匈牙利求 ...

随机推荐

  1. python 编码(encode)解码(decode)问题

    s = '匆匆'print(s)s1 = s.decode("utf-8") # utf-8 转成 Unicode,decode(解码)需要注明当前编码格式print(s1,typ ...

  2. DataSet 反射转换成 List<T>

    /// <summary> /// DataSet转换成指定返回类型的实体集合 /// </summary> /// <typeparam name="T&qu ...

  3. SpringBoot第二篇:配置文件详解一

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10837594.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   Sprin ...

  4. Prometheus 告警分配到指定接收组

    Prometheus 告警分配到指定接收组 route属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配. 主要处理流程:1. 接收到Alert,根据labels判断属于 ...

  5. 使用SonarQube和SonarQube Scanner分析项目

    一.概述 SonarQube的安装,请参考链接:https://www.cnblogs.com/xiao987334176/p/12011623.html 配置好sonar的服务端后,接下来就要使用s ...

  6. SQL参数化出现执行慢问题

    问题: 应用程序通过参数化访问数据库时出现执行效率慢,直接通过语句查时秒出结果,通过参数化查询时用时是前者的几十上百倍. 排查:1.使用了错误的执行计划; 解决:清除缓存的执行计划(未能解决上面问题) ...

  7. Winfrom devexpress 通用权限框架

    毕业到现在也快两年了,手上的项目也有好几个,但总感觉不是狠理想,近来把手上杂七杂八的项目整理了一下,结合各个项目的优点,重新开发了一套winfrom+devexpress 通用权限(CS)框架(BS版 ...

  8. Asp.net MVC企业级开发(02)---Log4net

    Log4Net 是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等).日志就是程序的“黑匣子”,可以通过日志查看系统的运行过程,从而发现系统的问题. 日志的作 ...

  9. Java中的集合类(List,Set.Map)

    1.List 1.1 Arraylist 与 LinkedList 区别 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 底层数据结构: Arr ...

  10. C# 【Http请求返回】性能优化500毫秒到 60 毫秒

    偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多.C# HttpRequest 要500毫秒 而Chrome 只需要 39ms. 作为有责任感的 码农.这个 必须 ...