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 ...
随机推荐
- Cxf -Wsdl2java详细参数附录
wsdl2java用法: wsdl2java -p com -d src -all aa.wsdl -p 指定其wsdl的命名空间,也就是要生成代码的包名: -d 指定要产生代码所在目录 -cl ...
- (八)boost库之异常处理
(八)boost库之异常处理 当你面对上千万行的项目时,当看到系统输出了异常信息时,你是否想过,如果它能将文件名.行号等信息输出,该多好啊,曾经为此绞尽脑汁. 今天使用boost库,将轻松的解决这个问 ...
- tcpdump 抓包让wireshark来分析
在linux下面用tcpdump 抓包非常方便, 但是抓的包要提取出来进行分析, 还是得用wireshark来过滤分析比较方便. 下面先介绍一下 TCPDUMP 的使用 例:tcpdump host ...
- How ASP.NET MVC Works?
原文地址:http://www.cnblogs.com/artech/archive/2012/04/10/how-mvc-works.html?ADUIN=7783008&ADSESSION ...
- (续)线性表之双向链表(C语言实现)
在前文实现单向链表的基本操作下,本文实现双向链表的基本操作. 双向链表与单链表差异,是双向链表结点中有前向指针和后向指针.所以在插入和删除新结点元素时候不见要考虑后向指针还要考虑前向指针. 以下是双向 ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- POJ 1724 最短路费用限制
迪杰斯塔拉裸题 最大花费 n个点 m条有向边 起点终点 路径长度 路径花费 问:在花费限制下,最短路径的长度 #include <iostream> #include <string ...
- nm命令中符号类型详解
摘自http://blog.csdn.net/solmyr_biti/article/details/6565479 nm命令介绍的很多,但大多不介绍其函数符号标志的含义.最近在调试动态库时常用到,其 ...
- CvMat、Mat、IplImage之间的转换详解及实例
见原博客:http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数 ...
- scrapy-redis实现爬虫分布式爬取分析与实现
本文链接:http://blog.csdn.net/u012150179/article/details/38091411 一 scrapy-redis实现分布式爬取分析 所谓的scrapy-redi ...