求最大留下的观众,观众之间存在不能同时满足的关系,就是矛盾关系,

矛盾关系建边,建边是双向的所以最大匹配要/2

还有一种建图的方法:把观众分成两个集合,一个是投留下猫的,一个是投留下狗的

每个集合间没有矛盾关系,就是二分图了,求出最大匹配,

两种方法都是要求最大独立集

#include<stdio.h>
#include<string.h>
#define N 510
int map[N][N],n,m,k,match[N],vis[N];
struct op
{
int love,hate;
}p[N];
int find(int x)
{
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&map[x][i]==1)
{
vis[i]=1;
if(match[i]==-1||find(match[i])==1)
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,sum,t,k;
int a[2];
char str[3];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&m,&k,&n);
for(i=1;i<=n;i++)
{
for(j=0;j<2;j++)
{
scanf("%s",str);
a[j]=0;
if(str[0]=='D')
{
for(k=1;str[k];k++)
a[j]=a[j]*10+str[k]-'0';
a[j]+=m;
}
else if(str[0]=='C')
for(k=1;str[k];k++)
a[j]=a[j]*10+str[k]-'0';
}
p[i].love=a[0];
p[i].hate=a[1];
}
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
sum=0;
for(i=1;i<=n;i++)
{
for(j=1;j<i;j++)
if(p[i].love==p[j].hate||p[i].hate==p[j].love)
map[i][j]=map[j][i]=1;
}
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
sum+=find(i);
}
//printf("%d\n",sum);
printf("%d\n",n-sum/2);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#define N 510
int map[N][N],n,m,k,match[N],vis[N],num1,num0;
struct op
{
int cat,dog;
}p[2][N];
int find(int x)
{
for(int i=1;i<num1;i++)
{
if(vis[i]==0&&map[x][i]==1)
{
vis[i]=1;
if(match[i]==-1||find(match[i])==1)
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,sum,t,k;
char str[10];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&m,&k,&n);
num1=num0=1;
for(j=1;j<=n;j++)
{
scanf("%s",str);
if(str[0]=='D')
{
p[1][num1].dog=0;
for(i=1;str[i];i++)
p[1][num1].dog=p[1][num1].dog*10+str[i]-'0';
scanf("%s",str);
p[1][num1].cat=0;
for(i=1;str[i];i++)
p[1][num1].cat=p[1][num1].cat*10+str[i]-'0';
num1++;//选择留下狗的观众人数
}
else
{
p[0][num0].cat=0;
for(i=1;str[i];i++)
p[0][num0].cat=p[0][num0].cat*10+str[i]-'0';
scanf("%s",str);
p[0][num0].dog=0;
for(i=1;str[i];i++)
p[0][num0].dog=p[0][num0].dog*10+str[i]-'0';
num0++;//选择留下猫的观众人数
}
}
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
sum=0;
for(i=1;i<num0;i++)
{
for(j=1;j<num1;j++)
if(p[0][i].cat==p[1][j].cat||p[0][i].dog==p[1][j].dog)
map[i][j]=1;
}
for(i=1;i<num0;i++)
{
memset(vis,0,sizeof(vis));
sum+=find(i);
}
//printf("%d\n",sum);
printf("%d\n",n-sum);
}
return 0;
}

hdu 2768的更多相关文章

  1. hdu 2768 Cat vs. Dog (二分匹配)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. hdu 2768(建图,最大点独立集)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU——2768 Cat vs. Dog

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  4. hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图

    题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的, ...

  5. ACM -二分图题目小结

    暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063  过 ...

  6. hdu-2768-Cat vs. Dog(二分图-最大匹配数)

    题意: 有猫C个和狗D个,有V个投票人,每个人喜欢猫讨厌狗或则喜欢狗讨厌猫! 求最多能满足多少投票人. 分析: 两个投票者矛盾的话就连一条边,总数减去最大匹配数/2就是要求的答案 // File Na ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

随机推荐

  1. LINUX下DNS的查看和配置

    linux下好像没有专门的DNS查看命令. 用ifconfig命令也是看不到DNS的信息.(也可能是我不知道) 本机的DNS配置信息是在:/etc/resolv.conf [root@localhos ...

  2. AIX安装SSH

    AIX 7.1   进入 https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=aixbp 先下载需要的openssl,op ...

  3. Qt widgets deeps--烧鸡

    1,Qt类读取目录 QDir读取目录内容--将读取结果输出到一个QMultiLineEdit对象 QMultiLineEdit *medit; medit = new QMultiLineEdit(t ...

  4. sql 中的 indexOf 与 lastIndexOf

    DECLARE @Name NVARCHAR (50)SET @Name = '12345.67890ABCDE.FGHIJKLMNOPQRSTUVWXYZTest' DECLARE @Positio ...

  5. ReactNative setNativeProps

    在封装原生组件的过程,如果我们希望在reactnative中触发原生的属性,但是又不需要暴露在reactnative的组件中. 那么我们就要用到setNativeProps这个方法,这个方法会直接触发 ...

  6. 开发SCM系统笔记001

    使用EasyUI分页问题: 1.在分页界面没有显示声明分页属性名称,系统如何获取? EasyUI会向后台发送page\rows两个参数. 2.在配置sql参数时,parametertype与param ...

  7. 步步学LINQ to SQL:将类映射到数据库表【转】

    [IT168 专稿]该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定.即使你选择使用了自 ...

  8. uva 11524 - InCircle (二分法)

    题意:三角形ABC的内切圆把它的三边分别划分成 m1:n1,m2:n2 和 m3:n3 的比例.另外已知内切圆的半径 r ,求三角形ABC 的面积. #include<iostream> ...

  9. NGUI 3.5过程(三)Button button

    写在前面:     本文将创建一个主要的Button.而且编写脚本,响应点击事件. 欢迎大家纠错.拍砖.原创非常辛苦,如有转载,请注明出处. Button -- button 在NGUI 3.5 里, ...

  10. mobilebone.js 移动web APP单页切换骨架

    轻便体积小 原生无依赖 插件可扩展 设计无限制 动效可定制 动静两相宜 能进亦能退 桌面也兼修 一句话功能简介跟传统网页浏览的差别仅仅在于无刷新! 例如,我们浏览首页,首页上有个如下HTML链接: & ...