快要比赛了 看看原来做过的题 感觉这道题当时做的还是挺费劲的 所以发一下

题意:

一个土豪要建别墅 因为有的地区地方不够大 所以要拆屋子

每个地方的字母就是对应开发商的地盘

没有字母的就是自由土地

一个开发商的土地只能拆一次

一片土地只能建一个别墅

问最多能建几个别墅

思路:

建图之后直接跑算法……

坑点是如果直接可以建别墅 就不用跑算法直接+1……

而且一片土地只能建一个别墅……

算法还是很模板的

(PS:代码太长风格不好的话真的没有可读性-_-||)

 #include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#define M(a,b) memset(a,b,sizeof(a))
#define ll long long
using namespace std;
const int inf=0x3f3f3f;
int linker[];
bool zimu[];
int match[][];
bool visy[],vis[][];
bool jump[];
bool find_(int a)
{
for(int i=; i<; i++)
{
if(match[a][i]==&&visy[i]==)
{
visy[i]=;
if(linker[i]==||find_(linker[i]))
{
linker[i]=a;
return true;
}
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
M(jump,);
M(linker,);
M(match,);
int s,m,n,h,w;
scanf("%d%d%d%d%d",&s,&m,&n,&h,&w);
getchar();
for(int i=; i<s; i++)
{
char map_[m+][n+];
memset(zimu,false,sizeof(zimu));
for(int j=; j<m; j++)
gets(map_[j]);
for(int j=; j<m; j++)
for(int k=; k<n; k++)
if(map_[j][k]!='') zimu[map_[j][k]-'A']=true;
for(int j=; j<; j++)
{
int cnt=;
if(zimu[j])
{
char map_1[m+][n+];
for(int k=; k<m; k++)
for(int l=; l<n; l++)
if(map_[k][l]=='A'+j) map_1[k][l]='';
else map_1[k][l]=map_[k][l];
M(vis,);
for(int k=; k+h-<m; k++)
{
for(int l=; l+w-<n; l++)
{
if(map_1[k][l]==''&&!vis[k][l]&&k+h-<m&&l+w-<n)
{
bool ok=true;
for(int p=; p<h; p++)
{
for(int q=; q<w; q++)
{
if(map_1[k+p][l+q]!=''&&!vis[k+p][l+q])
{
ok=false;
}
}
}
if(ok) cnt=;
}
}
}
}
match[i+][j+]=cnt;
if(j+==)
{
M(vis,);
bool ok=true;
cnt=;
for(int k=; k+h-<m; k++)
{
for(int l=; l+w-<n; l++)
{
ok=true;
if(map_[k][l]==''&&!vis[k][l])
{
for(int p=; p<h; p++)
{
for(int q=; q<w; q++)
{
if(map_[k+p][l+q]!=''&&!vis[k+p][l+q])
{
ok=false;
}
}
}
if(ok) cnt=;
}
}
}
if(cnt) jump[i+]=true;
}
}
}
int ans=;
for(int i=; i<=s; i++)
{
M(visy,);
if(jump[i]) ans++;
else if(find_(i)) ans++;
}
printf("%d\n",ans);
}
return ;
}
/* 2
3 4 3 3 2
A0B
000
0A0
00B
AA0
00B
0B0
000
A0A
000
B00
B00
3 4 3 3 2
A0B
000
0A0
00B
AA0
00B
0B0
000
A0A
000
0B0
B00 */

[ An Ac a Day ^_^ ] UVALive 2635 Housing Complexes 二分图最大匹配的更多相关文章

  1. UVaLive 6525 Attacking rooks (二分图最大匹配)

    题意:给定一个 n * n的图,X是卒, . 是空位置,让你放尽量多的车,使得他们不互相攻击. 析:把每行连续的 . 看成X集体的一个点,同理也是这样,然后求一个最大匹配即可. 代码如下: #prag ...

  2. UVALive 2635 匈牙利算法

    题意 给出k块地 规模n*m 需要在每块地中找至多一块h*w的地 这些地中如果包含字母 只能包含一种字母 如果一块地中选地使用了A 其余的地就不能使用A 但是全0可以重复 问 最后能最多选出来多少块地 ...

  3. UVALive 6811 Irrigation Line(二分图最小点覆盖--匈牙利算法)

    题意:求最少的线可以覆盖一个由0.1两种数字组成的图中所有的1. eg: 只需要两条线即可. 分析: 1.先为上述例子的行列标号 2.若图中数字为1,则代表该数字所在的行与列有关联. 例如第r1行第c ...

  4. UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)

    I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...

  5. 2019/2/18 Test

    图论模拟 [简述情况]: \(110/400\) \(20 \leq rank\) \(AC:1\) 有思路但未\(AC:0\) 无思路\(:3\) 题目 简述 \(LUOGU4304\) 二分图最大 ...

  6. UVALive 5903 Piece it together(二分图匹配)

    给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB  <==碎片 W 题目一看,感觉是精确覆盖(最近 ...

  7. Codeforces 590E - Birthday(AC 自动机+Dilworth 定理+二分图匹配)

    题面传送门 AC 自动机有时只是辅助建图的工具,真的 首先看到多串问题,果断建出 AC 自动机.设 \(m=\sum|s_i|\). 不难发现子串的包含关系构成了一个偏序集,于是我们考虑转化为图论,若 ...

  8. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  9. ACM进阶计划

    ACM进阶计划ACM队不是为了一场比赛而存在的,为的是队员的整体提高.大学期间,ACM队队员必须要学好的课程有:lC/C++两种语言l高等数学l线性代数l数据结构l离散数学l数据库原理l操作系统原理l ...

随机推荐

  1. SAP HANA中创建分析权限(Analytic Privilege)

    Demo Instruction: 假定CustomerID > 100的为VIP客户,我们的权限设置为只显示VIP客户 所使用的Attribute View: ATTR_CUSTOMER_FU ...

  2. FaceBook页面加载技术

    1. 技术背景 FaceBook页面加载技术 试想这样一个场景,一个经常访问的网站,每次打开它的页面都要要花费6 秒:同时另外一个网站提供了相似的服务,但响应时间只需3 秒,那么你会如何选择呢?数据表 ...

  3. Unity3d请求webservice

    我们在对接第三方sdk时,第三方sdk通常会以一个webservice接口的形式供我们来调用.而这些接口会以提供我们get,post,soap等协议来进行访问.get,post方法相信大家都比较熟悉了 ...

  4. CodeForces 689E Mike and Geometry Problem

    离散化,树状数组,组合数学. 这题的大致思路和$HDU$ $5700$一样.都是求区间交的问题.可以用树状数组维护一下. 这题的话只要计算每一个$i$被统计了几次,假设第$i$点被统计了$ans[i] ...

  5. CodeForces 676D Theseus and labyrinth

    最短路. $dis[i][j][k]$记录到点$(i,j)$,门的状态为$k$时的最短路.转移的时候有$8$种方案,即直接走向周围四个点,或者进行旋转.比较烦的是判断两个相邻的点在状态$k$下是否连通 ...

  6. [河南省ACM省赛-第四届] 序号互换 (nyoj 303)

    相似与27进制的转换 #include<iostream> #include<cstdio> #include<cstring> #include<strin ...

  7. C#中“类似GridView等控件”的前台显示与后台数据变化之间的关系

    最近用dev的treelist,gridcontrol等控件,这些控件显示数据都需要进行DataTable等数据源的绑定,而经理又要求可以随时更改其中的内容,刚开始总是不断的刷新控件.更新控件的数据源 ...

  8. 一个view相对于屏幕或者另外一个view 的坐标

    如果想知道一个view相对于屏幕或者另外一个view 的坐标,那么可以通过如下的方法得到: UIWindow * window=[[[UIApplication sharedApplication] ...

  9. CSS IE的bug

    没事总结一下IE的各种bug一下内容有一部分各位大神那里摘抄的,请恕小女子无罪: 1.ie6IE 6对margin的 auto 并没有正确的设置 解决方案:最简单的方法是在父元素中使用 text-al ...

  10. ajax jsonp 跨域请求

    $.ajax({ type:"get", url: "http://localhost/test/a.php", dataType: "jsonp&q ...