HDU - 3829 Cat VS Dog(最大独立集-二分图最大匹配)
题目链接:点击查看
题目大意:给出n只狗和m只猫,现在有p个小朋友,每个小朋友都有一只喜欢的猫和一只不喜欢的狗,或者有一只喜欢的狗和一只不喜欢的猫,如果一个小朋友喜欢的动物还在,不喜欢的动物走了,那么这个小朋友是开心的,现在怎么样让小动物走,才能让开心的小朋友最多
题目分析:其实题目中的猫和狗都是没有的无效信息,意在让我们按照猫和狗划分二分图,其实不然,有多少种动物都没有关系,实际上只是和每个小朋友喜欢以及不喜欢的动物有关系
因为这个题目中,留下一个动物或赶走一个动物,会造成的影响是对于小朋友而言的,所以我们要对于小朋友划分二分图,具体怎么划分呢,因为题目明确说明了要求出开心的小朋友的最大集合,那么在这个集合中的小朋友必须满足的条件就是任意一个小朋友喜欢的动物和其他所有小朋友不喜欢的动物不能相同,同理任意一个小朋友不喜欢的动物也不能和其他小朋友喜欢的动物相同,这样一来只需要将集合中所有小朋友不喜欢的动物赶走就能让这些小朋友开心了
说到这里,这不就是要求集合中的所有点都互相独立,换句话说不就是要求最大独立集,所以我们让所有有矛盾的小朋友互相建边,用匈牙利跑一下最大独立集就是这个题目的答案了,因为我们建立的是无向边,所以最后匹配后的答案记得除以二
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=510;struct Node
{string like,dislike;
}a[N];int match[N],vis[N],vis_cnt,n,m,p;bool maze[N][N];bool dfs(int x)
{for(int i=1;i<=p;i++){if(vis[i]!=vis_cnt&&maze[x][i]){vis[i]=vis_cnt;if(!match[i]||dfs(match[i])){match[i]=x;return true;}} }return false;
}void init()
{vis_cnt=0;memset(maze,false,sizeof(maze));memset(vis,-1,sizeof(vis));memset(match,0,sizeof(match));
}int main()
{
// freopen("input.txt","r",stdin);
// ios::sync_with_stdio(false);while(scanf("%d%d%d",&n,&m,&p)!=EOF){init();for(int i=1;i<=p;i++)cin>>a[i].like>>a[i].dislike;for(int i=1;i<=p;i++)for(int j=1;j<=p;j++)if(a[i].like==a[j].dislike||a[i].dislike==a[j].like)maze[i][j]=true;int ans=0;for(int i=1;i<=p;i++,vis_cnt++)if(dfs(i))ans++;printf("%d\n",p-ans/2);}return 0;
}
HDU - 3829 Cat VS Dog(最大独立集-二分图最大匹配)相关推荐
- HDU——2768 Cat vs. Dog
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...
- HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...
- CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*m的棋盘,有t个点是禁止放棋子的,现在按照马走日的规则,问在互不影响的情况下最多能放多少个马 题目分析:这里首先简单介绍一下二分图最大独立集的定义: 通俗来讲 ...
- HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...
- HDU 2063 过山车【二分图最大匹配】
Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生 ...
- 解题报告 (九) 二分图最大匹配
文章目录 二分图最大匹配 解题报告 一.最大匹配模板题 HDU 1083 Courses HDU 2063 过山车 HDU 1528 Card Game Cheater HDU 1179 Olliva ...
- 图论总结(一)二分图最大匹配
二分图最大匹配 (一).二分图 1.定义 2.性质 3.判定 (二).二分图的匹配 1.二分图的最大匹配 2. König定理及其证明 3.最小边覆盖与最大独立集 (三).增广路径 1.定义 2.性质 ...
- 二分图最大匹配与最大独立集
一.概念部分 1.什么是二分图? 通俗的说法:就是可以把图分成两部分,每一部分任意两点之间没有关系(同一部落),两部分之间点可能存在多种关系. 2.怎么判断二分图? (1)理论判定:如果某个图为二分图 ...
最新文章
- npm修改淘宝镜像飞速下载,npm install过程速度优化,npm删除镜像恢复默认
- LeetCode 492. 构造矩形
- 未为dll加载任何符号_专家发现aspersky 和Trend Micro安全性解决方案中的DLL劫持问题...
- 什么是Shell、Shell脚本
- 【Kafka】Kafka InvalidReceiveException: Invalid receive (size = 369296128 larger than 104857600)
- 电脑和树莓派之间文件传输
- 未来的信息化,就是挖掘企业数据、提升战略决策
- python双目视觉三维重建代码_双目立体视觉的三维重建方法与流程
- 点云能量预测:KPConv点云输入方式
- tortoiseHg查看后一个版本和parent版本的不同
- 老男孩Linux高新运维第28期最终篇+老男孩Linux运维+老男孩linux运维全套
- Bus Hound 的使用方法
- java NEW一个对象之后加入大括号
- MATLAB 绘制空间分布图,颜色代表数值(替代ArcGIS)
- 使用Labwindows开发DAQmx
- matlab计算星期,在matlab中计算周数
- Windows快速访问无法取消固定
- 响应式图片的3种解决方案
- 基于ESP8266的四旋翼无人机代码分享,该无人机可以爬墙哦
- linux命令 sh -s,shell脚本中 if 判断时候-s是什么意思?