hdu 2768
求最大留下的观众,观众之间存在不能同时满足的关系,就是矛盾关系,
矛盾关系建边,建边是双向的所以最大匹配要/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的更多相关文章
- hdu 2768 Cat vs. Dog (二分匹配)
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 2768(建图,最大点独立集)
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU——2768 Cat vs. Dog
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图
题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的, ...
- ACM -二分图题目小结
暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063 过 ...
- hdu-2768-Cat vs. Dog(二分图-最大匹配数)
题意: 有猫C个和狗D个,有V个投票人,每个人喜欢猫讨厌狗或则喜欢狗讨厌猫! 求最多能满足多少投票人. 分析: 两个投票者矛盾的话就连一条边,总数减去最大匹配数/2就是要求的答案 // File Na ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
随机推荐
- JVM的体系结构——JVM之三
JVM的内部体系结构分为四部分, (1)类装载器(ClassLoader)子系统 作用: 用来装载.class文件 (2)执行引擎 作用:执行字节码,或者执行本地方法 (3)垃圾回收子系统 作用:垃圾 ...
- MFC 操作控件数据
在MFC中有多种获取控件数据的方法 1.GetWindowText()和SetWindowText()函数 ],ch2[],ch3[]; GetDlgItem(IDC_EDIT1)->Get ...
- linux之SQL语句简明教程---CREATE INDEX
索引 (Index) 可以帮助我们从表格中快速地找到需要的资料.举例来说,假设我们要在一本园艺书中找如何种植青椒的讯息.若这本书没有索引的话,那我们是必须要从头开始读,直到我们找到有关种直青椒的地方为 ...
- Baby Ming and Matrix games(dfs计算表达式)
Baby Ming and Matrix games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- TimeSpan类【转】
TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); //获取当前时间的刻度数 //执行某操作 ............................ . ...
- Android EditText限制输入一些固定字符的属性
android:digits="abcdefghijklmnopqrstuvwxyz1234567890" 仅仅能输入这些
- session劫持以及预防
session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一 ...
- IE6、7下获得offset值跟其他浏览器不一样问题
大家都知道,offset是元素的位置坐标,那位置坐标又和文档流有关系.如果position默认不设置的话,其值是static.static是个什么东东呢?下面我详细介绍一下: 语法: position ...
- asp.net application
Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象.不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对 ...
- Android 简单的代码混淆
Android的代码混淆是开发者需要了解的相关知识,它能够防止android应用程序的反编译.因为android程序多数是java语言开发的,而java代码很容易被反编译,所以为了使android应用 ...