UESTC-1963咸鱼咕咕咕(二分图匹配)
咸鱼咕咕咕
Time Limit: 1000 MS Memory Limit: 64 MB
咸鱼有个咕咕笼。
咕咕笼可以划分成m×nm×n个格子,每个小格子可以放下一只咕咕,也可以放下一个咕咕槽。
现在咕咕笼里有若干只咕咕。
放在咕咕笼里的咕咕能够看到他上下左右四个方向上的所有格子。
当然,因为咕咕槽比较高,那群咕咕没办法看见咕咕槽后面的咕咕。
咸鱼发现如果两只咕咕能够看见对方,他们会在咸鱼离开的时候跑在一起形成更大的咕咕咕咕,否则他们只会像条咸鱼一样安心待在那里咕咕。
现在咸鱼不希望他们形成咕咕咕咕,需要带走一些咕咕。
但是带走太多的咕咕会让咸鱼咕咕咕咕。
咸鱼希望你能帮他决定至少应该带走多少只咕咕。

Input
第一行两个整数mm,nn。(1≤m,n≤50)(1≤m,n≤50)
接下来mm行,每行一个字符串,含有nn个字符。
第ii个字符串第jj个字符表示了咕咕笼第ii行第jj列的情况。
若字符为o,表示这上面有只咕咕。
若字符为+,表示这上面有个咕咕槽。
若字符为.,表示上面既没有咕咕,也没有咕咕槽。
Output
输出咸鱼至少应该带走多少只咕咕。
Sample input and output
| Sample Input | Sample Output |
|---|---|
2 2 |
0 |
2 5 |
1 |
1 1 |
0 |
Hint
Sample 1: 不需要带走咕咕。
Sample 2: 至少需要带走(2,2)(2,2)或(2,5)(2,5)其中一只咕咕,不然他们会在咸鱼离开后变成咕咕咕咕。
Sample 3: 没有咕咕可带。
题解:
这一题最主要的就是建图,我们可以这么考虑,如果同一行中的两个咕咕之间存在咕咕槽,则把他们当做不同行去处理,如果同一列中的两个咕咕之间存在咕咕槽,则把他们当做不同列去处理。然后行作为一个集合,列作为一个集合,做二分图匹配,最终答案则是咕咕数减去最大匹配数。
为什么可以这么做呢?因为如果某一行中没有咕咕槽的话,那么这一行只允许存在一个咕咕(因为如果存在两个或两个以上的咕咕会形成咕咕咕咕),对于列也是如此。如果有咕咕槽,咕咕槽两边的咕咕可以同时存在于同一行或同一列,为了转化为二分图匹配的问题,我们就可以把他们当成不同行或不同列。二分图最大匹配就可以求出最终矩阵中最多可以放置多少个咕咕且不会形成咕咕咕咕。
AC代码为:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
char s[1000][1000];
int n,m,o,p,sum,num,i,j,k,kk,q,ii,e[maxn],f[maxn],c[maxn],d[maxn],a[maxn],b[maxn],link[2555][2555],girl[10000],used[10000];
bool found(int x)
{
for (int i=1;i<=kk;i++)
if (link[x][i]&&!used[i])
{
used[i]=1;
if (girl[i]==0||found(girl[i]))
{
girl[i]=x;
return(1);
}
}
return(0);
}
int main()
{
cin>>m>>n;
for (i=1;i<=m;i++)
cin>>s[i];
o=0;
for (i=1;i<=m;i++)
{
for (j=0;j<=n-1;j++)
if (s[i][j]=='o')
{
p=0; q=0;
for (ii=0;ii<j;ii++)
if (s[i][ii]=='+') p++;
for (ii=1;ii<i;ii++)
if (s[ii][j]=='+') q++;
o+=1;
a[o]=i+p*m;
b[o]=j+1+q*n;
}
}
for (i=1;i<=o;i++)
{
e[i]=a[i];
f[i]=b[i];
}
sort(a+1,a+1+o);
sort(b+1,b+1+o);
c[a[1]]=1;
k=1;
for (i=2;i<=o;i++)
if (a[i]==a[i-1]) c[a[i]]=k; else {k++;c[a[i]]=k;}
d[b[1]]=1;
kk=1;
for (i=2;i<=o;i++)
if (b[i]==b[i-1]) d[b[i]]=kk; else {kk++;d[b[i]]=kk;}
for (i=1;i<=o;i++)
link[c[e[i]]][d[f[i]]]=1;
for (i=1;i<=kk;i++)
girl[i]=0;
num=0;
for (i=1;i<=k;i++)
{
memset(used,0,sizeof(used));
if (found(i)) num++;
}
printf("%d\n",o-num);
return(0);
}
UESTC-1963咸鱼咕咕咕(二分图匹配)的更多相关文章
- UESTC 898 方老师和缘分 --二分图匹配+强连通分量
这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...
- u-boot for tiny210 ver1.0(by liukun321咕唧咕唧)
新版本下载: 下面的链接提供了较新版本的源码 ver4.0源码下载:u-boot for tiny210 ver4.0 ver3.1源码下载: u-boot for tiny210 ver3.1 v ...
- (转)S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)
作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...
- UVA 12549 - 二分图匹配
题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...
- POJ 1274 裸二分图匹配
题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- HDU1281-棋盘游戏-二分图匹配
先跑一个二分图匹配,然后一一删去匹配上的边,看能不能达到最大匹配数,不能这条边就是重要边 /*----------------------------------------------------- ...
- HDU 1083 网络流之二分图匹配
http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...
- hdu 5727 Necklace dfs+二分图匹配
Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...
随机推荐
- MySQL每个分类的前几条记录
MySQL 获取所有分类和每个分类的前几条记录 比如有文章表 Article(Id,Category,InsertDate) 现在要用SQL找出每种类型中时间最新的前N个数据组成的集合 SELECT ...
- jenkins里的定时构建
1. 定时构建语法:* * * * * (五颗星,多个时间点,中间用逗号隔开)第一个*表示分钟,取值0~59第二个*表示小时,取值0~23第三个*表示一个月的第几天,取值1~31第四个*表示第几月,取 ...
- hdu 1556 Color the ball (树状数组)
Color the ballTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- set map symbol
set 声明 let set = new Set();即创建了一个空的set 赋值 let set = new Set(['张三','李四','王五']); 特性 似于数组,但它的一大特性就是所有元素 ...
- 用 GitBook 创建一本书
用 GitBook 创建一本书 Gitbook 首先是一个软件,它使用 Git 和 Markdown 来编排书本,如果你没有听过 Git 和 Markdown,那么 gitbook 可能不适合你直接入 ...
- 简单说说基于JWT的token认证方式
一.什么是认证 好多人不知道什么是认证,认证,其实就是服务端确认用户身份.Http协议是无状态的,客户端发送一条请求,服务端返回一条响应,二者就算做成一单买卖,一拍两散.在很久以前,互联网所能提供的服 ...
- 使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV
如果你使用gcc对一部分模块进行了GNUMake的编译,这些编译出动态库使用在Gradle编译框架下的项目.那么就有可能出现题目中的情况,使用不同的C++支持库的模块混合开发时,引发异常展开不正常. ...
- vim常用插件使用方法整理【持续更】
nerdtree 和编辑文件一样,通过h j k l移动光标定位切换工作台和目录 ctr+w+h 光标focus左侧树形目录,ctrl+w+l 光标focus右侧文件显示窗口. ctrl+w+w,光标 ...
- IT人该如何未雨绸缪,不断提升自己的竞争力?同时尽量避免风险?
人会慢慢变老,变老后精力,记忆力乃至身体会慢慢变差,这是无法逆转的自然规律.随之会产生的是对中年危机的忧虑乃至恐惧,比如担心能力精力不及年轻人,从而导致收入锐减乃至失业. 对此我有如下三点不解.第一, ...
- 【Luogu P1164】小A点菜
题目原链接: Luogu 小A点菜 [解题思路] 常规的0-1背包,不过是求装满整个背包的方案数,只要把0-1背包的状态转移方程稍微改一下就行.因为要求方案数,那么把方程中的max换成sum就行. [ ...