题意:

      有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩。

思路:

       比较简单二分图的最大独立集元素个数,我们直接把可能产生爱意(四个都不满足)的连上边,然后一遍匈牙利,最后输出n-匹配数就行了,为什么是这样我就不证明了,比较经典简单的问题。

#include<stdio.h>

#include<string.h>

#define N_node 550

#define N_edge 255000

typedef struct

{

   int to ,next;

}STAR;

typedef struct

{

   int h;

   char str1[5] ,str2[110] ,str3[110];

}NODE;

NODE node[N_node];

STAR E[N_edge];

int list[N_node] ,tot;

int mk_dfs[N_node] ,mk_gx[N_node];

void add(int a, int b)

{

   E[++tot].to = b;

   E[tot].next = list[a];

   list[a] = tot;

}

int DFS_XYL(int x)

{

    for(int k = list[x] ;k ;k = E[k].next)

    {

       int to = E[k].to;

       if(mk_dfs[to]) continue;

       mk_dfs[to] = 1;

       if(mk_gx[to] == -1 || DFS_XYL(mk_gx[to]))

       {

          mk_gx[to] = x;

          return 1;

       }

    }

    return 0;

}

int abss(int x)

{

   return x > 0 ? x : -x;

}

bool jude(int a ,int b)

{

    return abss(node[a].h - node[b].h) <= 40 && node[a].str1[0] != node[b].str1[0] && !strcmp(node[a].str2 ,node[b].str2) && strcmp(node[a].str3 ,node[b].str3);

}

   

int main ()

{

   int t ,n ,i ,j;

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d" ,&n);

      for(i = 1 ;i <= n ;i ++)

      scanf("%d %s %s %s" ,&node[i].h ,node[i].str1 ,node[i].str2 ,node[i].str3);

      

      memset(list ,0 ,sizeof(list)) ,tot = 1;

      for(i = 1 ;i <= n ;i ++)

      for(j = i + 1 ;j <= n ;j ++)

      {

         if(jude(i ,j))

         {

            node[i].str1[0] == 'M' ? add(i ,j) : add(j ,i);

         }

      }

      memset(mk_gx ,255 ,sizeof(mk_gx));

      int Ans = 0;

      for(i = 1 ;i <= n ;i ++)

      {

         memset(mk_dfs ,0 ,sizeof(mk_dfs));

         Ans += DFS_XYL(i);

      }

      printf("%d\n" ,n - Ans);

    }

    return 0;



           

   

最新文章

  1. PHP常用函数总结
  2. 使用Timer和ScheduledThreadPoolExecutor执行定时任务
  3. JavaScript的事件对象_键盘事件
  4. 奶牛通讯 usaco 网络流
  5. 在命令行中如何访问Program Files文件夹(转)
  6. 百度地图BMap API实例
  7. 英文:known good board ( KGB) / 中文:测试用标准板,黄金板
  8. Windows与Linux文件系统互访的几种方法
  9. linux入门--Linux发行版本详解
  10. Win10升级惹的祸,Oracle服务全没有了,怎么解决?
  11. [WC2019] 数树
  12. 2018 ICPC青岛网络赛 B. Red Black Tree(倍增lca好题)
  13. wallet.metamask.io 网页版钱包 connecting unknown network导致页面卡住
  14. find,xargs,tar有选择打包
  15. 编写html与js交互网页心得:编写两个按钮切换显示不同的图片
  16. &lt;转&gt;ML 相关算法参考
  17. [AHOI2009]飞行棋
  18. INDY10 IDHTTPSERVER返回中文不乱码
  19. Modifying a Request or Response
  20. linux配置防火墙打开3306端口

热门文章

  1. Solon 框架详解(十一)- Solon Cloud 的配置说明
  2. lucent,solr,ES比较
  3. go语言几个最快最好运用最广的web框架比较
  4. CentOS 7 卸载 OpenJDK 安装 OracleJDK
  5. MySQL优化从执行计划开始(explain超详细)
  6. PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642
  7. Node.js核心入门
  8. 01-MySQL Linux安装
  9. 201871030107-常雅伦 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
  10. oo第二单元博客总结