设为首页 加入收藏

TOP

HDU 3829 Cat VS Dog
2015-07-20 17:33:18 来源: 作者: 【 】 浏览:2
Tags:HDU 3829 Cat Dog

题意:

p个人 每个人有喜欢和讨厌的动物 如果选出的动物中包含这个人喜欢的动物同时不包含他讨厌的动物那么这个人会开心 问 最多几个人开心

思路:

二分图最大独立集 利用人与人之间的冲突建边 求最大匹配即可

注意:

题中的样例给出动物的名字是D1、C1之类的 其实名字可能比这个长… 所以数组开长点

代码:

#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
        #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #include
             
               using namespace std; typedef unsigned long long LL; #define N 510 struct edge { int v, next; } ed[N * N]; int vis[N], match[N], head[N]; int n, tot; char like[N][10], dislike[N][10]; void add(int u, int v) { ed[tot].v = v; ed[tot].next = head[u]; head[u] = tot++; } bool dfs(int u) { int i, v; for (i = head[u]; ~i; i = ed[i].next) { v = ed[i].v; if (!vis[v]) { vis[v] = 1; if (!match[v] || dfs(match[v])) { match[v] = u; return true; } } } return false; } int bimatch() { int i, sol = 0; memset(match, 0, sizeof(match)); for (i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if (dfs(i)) sol++; } return sol; } int main() { int i, j, ans; while (~scanf("%d%d%d", &i, &j, &n)) { for (i = 1; i <= n; i++) scanf("%s%s", like[i], dislike[i]); memset(head, -1, sizeof(head)); tot = 0; for (i = 1; i <= n; i++) { for (j = i + 1; j <= n; j++) { if (!strcmp(like[i], dislike[j]) || !strcmp(like[j], dislike[i])) { add(i, j); add(j, i); } } } ans = n - bimatch() / 2; printf("%d\n", ans); } return 0; } 
             
            
           
          
         
        
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 4812 D Tree 树分治+逆元+has.. 下一篇hdu 4871 树的分治+最短路记录路径

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·JAVA现在的就业环境 (2025-12-26 01:19:24)
·最好的java反编译工 (2025-12-26 01:19:21)
·预测一下2025年Java (2025-12-26 01:19:19)
·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)