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

矛盾关系建边,建边是双向的所以最大匹配要/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. rsyslog 同时发生nginx 访问日志和错误日志

    input(type="imfile" File="/var/log/nginx/access.log" Tag="zjzc-frontend01-a ...

  2. Node.js log1: ERR can not find module express

    1.win7下创建项目中提示输入的命令:cd project&&npm install    安装失败 输入上面提示的命令,预期结果:自动安装了依赖 ejs 和 express,失败提 ...

  3. 【FSFA 读书笔记】Ch 2 Computer Foundatinons(2)

    Hard Disk Technology 1. 机械硬盘内部构造 几个重要概念:Sector(扇区),Head(读写头),Track(磁道),Cylinder(柱面). 如果一个文件比较大,磁盘的写入 ...

  4. 甲骨文推动Java进军“物联网”

    该公司希望在嵌入式设备开发项目上Java可以取代C     随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...

  5. 任务调度开源框架Quartz动态加入、改动和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包括了调度器监听.作业和触发器监听.你能够配置作业和触发器监听为全局监听或者是特定于 ...

  6. 模块化利器:RequireJS常用知识

    1. 模块化 目前常见的模块化开发方式,全局空间方式是最基本的一种,另外常见的还有遵循AMD规范的开发方式,遵循CMD规范的开发方式,和ECMAScript 6的开发方式.需要说明的是,CMD和ES6 ...

  7. Open Replicator

    Open Replicator ( http://code.google.com/p/open-replicator/ ) 开源了.Open Replicator是一个用Java编写的MySQL bi ...

  8. SqlHelper数据库访问类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  9. CSS3阴影 box-shadow的使用

      text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[ins ...

  10. Excel 用row()函数 在Excel中自动添加序号,

    1.如图 2.用if条件根据产品名称判断是否有值进而序号自动添加 If(G9="","",Row()-8)