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

矛盾关系建边,建边是双向的所以最大匹配要/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. 反调试技术(Delphi版)

    1.程序窗口句柄检测原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行//****************************************** ...

  2. Linux下chkconfig命令详解(转)

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  3. firebug加载不了js脚本文件问题

    转载自:http://tieba.baidu.com/p/1008322286 现象: 页面中有加载js文件,但是firebug却提示:    本页面不包含 Javascript 如果 <scr ...

  4. User has no SELECT privilege on V$SESSION

         今天是2013-09-20,最近心情一直很差,但是也不能不学习啊,无论怎么样,自己学到 的东西永远都是自己的.加油! 使用dbms_xplan.display_cursor function ...

  5. convert用法(数据库中原本储存的格式是Nvarchar,如何修改成datetime格式)

    查询这张表得到的数据如图 select CONVERT(nvarchar,substring([purchase-date],1,4)) +'-'+CONVERT(nvarchar,substring ...

  6. asp.net中,我们使用ashx获取数据列表,在前端使用$.ajax()解析

    一直在想在asp.net中怎么才能向在java中那样用struts那样做页面请求. 当然asp.net mvc就是类似struts的东西吧,不过还没来得及学习. 今天就用ashx来接收页面请求,并调用 ...

  7. Metropolis Hasting算法

    Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术,一个非常重要的应用是从给定的概率分布中抽样.主要原理是构造了一个精妙的Markov链,使得该链的稳态 ...

  8. android典型监听事件实

    public class MainActivity extends Activity { int counter; Button add, sub; TextView display; @Overri ...

  9. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  10. struts2 s:if 的字符串比较问题

    如果数据库字段的数据类型为string or  char 类型,此时在页面 <s:if test=""></s:if> 中test <s:iterat ...