这是经典的最大点独立集

还是可以转化成最大匹配数,为什么呢,因为求出最大匹配数之和,匹配的边的两个端点互斥,只能去一个,所以最后结果就用总点数-最大匹配数即可

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int h[],sex[];
  7. char music[][],ball[][];
  8. int d[][],vis[],lefts[];
  9. int n;
  10. bool match(int u)
  11. {
  12. for (int v=;v<n;v++){
  13. if (d[u][v] && !vis[v]){
  14. vis[v]=;
  15. if (lefts[v]==- || match(lefts[v])){
  16. lefts[v]=u;
  17. return true;
  18. }
  19. }
  20. }
  21. return false;
  22. }
  23. int main()
  24. {
  25. int t;
  26. char tmp[];
  27. scanf("%d",&t);
  28. while (t--)
  29. {
  30. scanf("%d",&n);
  31. for (int i=;i<n;i++){
  32. scanf("%d%s%s%s",&h[i],tmp,music[i],ball[i]);
  33. if (tmp[]=='M') sex[i]=;
  34. else sex[i]=;
  35. }
  36. memset(d,,sizeof d);
  37. for (int i=;i<n;i++)
  38. for (int j=i+;j<n;j++){
  39. if (abs(h[i]-h[j])<= && (sex[i]^sex[j]) && strcmp(music[i],music[j])== && strcmp(ball[i],ball[j])!=){
  40. if (sex[i]==) d[i][j]=;
  41. else d[j][i]=;
  42. }
  43. }
  44. int sum=;
  45. memset(lefts,-,sizeof lefts);
  46. for (int i=;i<n;i++){
  47. memset(vis,,sizeof vis);
  48. if (match(i)) sum++;
  49. }
  50. int ans=n-sum;
  51. printf("%d\n",ans);
  52. }
  53. return ;
  54. }

这个题目也可以不把男女生分开建图(上面我区分了男女,把男的放在左边) 全部统一建图,求出来的匹配数/2即可,原因很简单,其实就是统一建图就是把上面的图左右反过来又加在原图一下,所以匹配数是实际的两倍

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int h[],sex[];
  7. char music[][],ball[][];
  8. int d[][],vis[],lefts[];
  9. int n;
  10. bool match(int u)
  11. {
  12. for (int v=;v<n;v++){
  13. if (d[u][v] && !vis[v]){
  14. vis[v]=;
  15. if (lefts[v]==- || match(lefts[v])){
  16. lefts[v]=u;
  17. return true;
  18. }
  19. }
  20. }
  21. return false;
  22. }
  23. int main()
  24. {
  25. int t;
  26. char tmp[];
  27. scanf("%d",&t);
  28. while (t--)
  29. {
  30. scanf("%d",&n);
  31. for (int i=;i<n;i++){
  32. scanf("%d%s%s%s",&h[i],tmp,music[i],ball[i]);
  33. if (tmp[]=='M') sex[i]=;
  34. else sex[i]=;
  35. }
  36. memset(d,,sizeof d);
  37. for (int i=;i<n;i++)
  38. for (int j=i+;j<n;j++){
  39. if (abs(h[i]-h[j])<= && (sex[i]^sex[j]) && strcmp(music[i],music[j])== && strcmp(ball[i],ball[j])!=){
  40. d[i][j]=d[j][i]=;
  41. // cout<<h[i]<<" "<<h[j]<<endl;
  42. // cout<<i<<" is connect "<<j<<endl;
  43. }
  44. else d[i][j]=d[j][i]=;
  45. }
  46. int sum=;
  47. memset(lefts,-,sizeof lefts);
  48. for (int i=;i<n;i++){
  49. memset(vis,,sizeof vis);
  50. if (match(i)) sum++;
  51. }
  52. //cout<<sum<<endl;
  53. int ans=n-sum/;
  54. printf("%d\n",ans);
  55. }
  56. return ;
  57. }

POJ 2771 最大点独立集的更多相关文章

  1. POJ 2771 Guardian of Decency(求最大点独立集)

    该题反过来想:将所有可能发生恋爱关系的男女配对,那么可以带出去的人数应该等于这个二分图的最大独立集 先要做一下预处理,把不符合要求的双方先求出来, company[i][j]表示i.j四个标准都不符合 ...

  2. POJ 2771 Guardian of Decency (二分图最大点独立集)

    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 25 ...

  3. 【POJ】1419:Graph Coloring【普通图最大点独立集】【最大团】

    Graph Coloring Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5775   Accepted: 2678   ...

  4. POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法

    Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5884   Accepted: 2877 Desc ...

  5. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

  6. POJ1466 Girls and Boys(二分图最大点独立集)

    最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...

  7. HDU--3829--Cat VS Dog【最大点独立集】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...

  8. UVA 12083 POJ 2771 Guardian of Decency

    /* http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71805#problem/C */ 性质: [1]二分图最大点独立数=顶点数-二分图 ...

  9. BZOJ 1143: [CTSC2008]祭祀river(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题意: 思路: 二分图最大点独立集,首先用floyd判断一下可达情况. #include< ...

随机推荐

  1. linux下FTP的工具和使用以及rpmReadSignature failed错误

      安装rpm文件时提示rpmReadSignature failed 错误 2011-09-23 11:04 现象: [root@localhost share]# rpm -ivh syslog- ...

  2. arm linux 移植 jpeg

    背景: host平台 :Ubuntu 16.04 arm平台 : S5P6818 jpeg :v9c arm-gcc :4.8.1 主机准备: 运行以下脚本: ## # Copyright By Sc ...

  3. ElasticSearch入门了解

    什么是Elasticsearch: Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 1.什么是搜索? 搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索 ...

  4. PE文件结构体-IMAGE_DATA_DIRECTORY

    IMAGE_OPTIONAL_HEADER结构体最后一个成员是数组结构,大小为16,每个元素都是一个IMAGE_DATA_DIRECTORY结构体 typedef struct _IMAGE_DATA ...

  5. 南邮平台之Hello,RE!

    小白闲逛了一下南邮平台看到了逆向这题,小白在网上看了一下别人的write up发现有点复杂.于是小白就试试看,直接Underfine然后结果就出来了.....有点意外...... 结果flag{Wel ...

  6. Java虚拟机05.2(内存分配)

    jdk1.7中堆内存分为:年轻代+老年代+永久代.但是永久代有作为非堆内存存在,也就是说堆内存的大小应该为年轻代+老年代.在tomcat容器中,如果jsp页面过多可能出现永久代溢出.通常栈溢出都是程序 ...

  7. 深入理解JVM Note

    第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈.堆和方法区. 线程共享的:堆.方法区 不共享的:栈.程序计数器(代码执行的行号) 程序计数器(Program Counter Re ...

  8. pytesseract 识别率低提升方法

    pytesseract 识别率低提升方法 一.跟换识别语言包 下载地址https://github.com/tesseract-ocr/tessdata 二.修改图片的灰度 from PIL impo ...

  9. OLTP和OLAP区别详解

    Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型,一种是面向前台应用的,应用比较简单,但是重吞吐和高并发的OLTP类型:一种是重计算的,对大数据 ...

  10. PG、GP与MySQL的特点和区别

    参考 PostgreSQL数据库 介绍:PostgreSQL是一种运行在Unix和Linux操作系统(在NT平台借助Cygnus也可以运行)平台上的免费的开放源码的关系数据库.最早是由美国加州大学伯克 ...