zoukankan      html  css  js  c++  java
  • hdu 2768(最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2768

    思路:把喜欢cat的和喜欢dog的看成两个集合,如果这两个集合有冲突,即cat.love==dog.hate或者cat.hate==dog.love,这连边,代表有矛盾,那么最后的结果不就是求一下最大独立集吗。

    最大独立集=顶点数-最大匹配。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<algorithm>
     6 using namespace std;
     7 #define MAXN 2222
     8 struct Node {
     9     string love;
    10     string hate;
    11 } cat[MAXN],dog[MAXN];
    12 int cat_cnt,dog_cnt;
    13 bool map[MAXN][MAXN];
    14 bool mark[MAXN];
    15 int ly[MAXN];
    16 char s1[11],s2[11];
    17 
    18 int dfs(int u) {
    19     for(int v=0; v<dog_cnt; v++) {
    20         if(map[u][v]&&!mark[v]) {
    21             mark[v]=true;
    22             if(ly[v]==-1||dfs(ly[v])) {
    23                 ly[v]=u;
    24                 return 1;
    25             }
    26         }
    27     }
    28     return 0;
    29 }
    30 
    31 int MaxMatch() {
    32     int res=0;
    33     memset(ly,-1,sizeof(ly));
    34     for(int i=0; i<cat_cnt; i++) {
    35         memset(mark,false,sizeof(mark));
    36         res+=dfs(i);
    37     }
    38     return res;
    39 }
    40 
    41 int main() {
    42 //   freopen("1.txt","r",stdin);
    43     int _case,c,d,v;
    44     scanf("%d",&_case);
    45     while(_case--) {
    46         scanf("%d%d%d",&c,&d,&v);
    47         cat_cnt=dog_cnt=0;
    48         for(int i=0; i<v; i++) {
    49             scanf("%s%s",s1,s2);
    50             if(s1[0]=='C') {
    51                 cat[cat_cnt].love=s1;
    52                 cat[cat_cnt++].hate=s2;
    53             } else {
    54                 dog[dog_cnt].love=s1;
    55                 dog[dog_cnt++].hate=s2;
    56             }
    57         }
    58         memset(map,false,sizeof(map));
    59         for(int i=0; i<cat_cnt; i++) {
    60             for(int j=0; j<dog_cnt; j++) {
    61                 if(cat[i].love==dog[j].hate||cat[i].hate==dog[j].love) {
    62                     map[i][j]=true;
    63                 }
    64             }
    65         }
    66         int ans=MaxMatch();
    67         printf("%d\n",v-ans);
    68     }
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    Vue-router笔记
    webpack及其配置
    高阶函数+组件化开发
    Es6语法+v-on参数相关+vue虚拟dom
    英语资源及其APP推荐
    Qt获取ip地址
    QT创建和使用动态链接库
    error C2664: “strcmp”: 不能将参数 1 从“WCHAR [260]”转换为“const char *”
    Vue|VUE router 导航重复点击报错的问题解决方案
    Vue|触发路由跳转
  • 原文地址:https://www.cnblogs.com/wally/p/3119253.html
Copyright © 2011-2022 走看看