UVALive 5903 Piece it together 二分匹配,拆点 难度:1
对L研究可以发现
相当于黑-横白,黑-纵白,每个黑白都要被匹配到,其中黑的横纵各两次,
很自然的想到拆点,黑点拆成专门和横白连接的,专门和纵白连接的,
如果2*黑==白数,运行一次二分匹配算法,匹配数==白数则为可行,剩下的都不可行
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
char maz[600][601];
int ind[600][600];
int n,m;
bool inmaz(int x,int y){return 0<=x&&x<n&&0<=y&&y<m;}
struct pnt{
int x,y;
pnt(){x=y=0;}
pnt(int x,int y){this->x=x;this->y=y;}
};
pnt pw[600*600],pb[600*600];
int lenw,lenb;
int e[2*600*600][8];
int len[2*600*600]; int mch[2*600*600];
bool used[2*600*600]; bool dfs(int s){
used[s]=true;
for(int i=0;i<len[s];i++){
int t=e[s][i];
if(mch[t]==-1||(!used[mch[t]]&&dfs(mch[t]))){
mch[t]=s;
mch[s]=t;
return true;
}
}
return false;
} int match(){
memset(mch,-1,sizeof(int)*2*lenw);
int res=0;
for(int i=0;i<lenw*2;i++){
if(mch[i]==-1){
memset(used,false,2*lenw);
if(dfs(i)){
res++;
}
}
}
return res;
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
lenb=lenw=0;
memset(len,0,sizeof(len));
memset(ind,0,sizeof(ind));
for(int i=0;i<n;i++)scanf("%s",maz[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(maz[i][j]=='W'){
ind[i][j]=lenw;
pw[lenw++]=pnt(i,j);
}
else if(maz[i][j]=='B'){
ind[i][j]=lenb;
pb[lenb++]=pnt(i,j);
}
}
}
if(lenw!=lenb*2){
puts("NO");
continue;
}
for(int i=0;i<lenb;i++){
int x=pb[i].x,y=pb[i].y;
for(int j=0;j<2;j++){
int txj=x+dx[j],tyj=y+dy[j];
if(!inmaz(txj,tyj)||maz[txj][tyj]!='W')continue;
int indj=ind[txj][tyj],hor=lenw+2*i+1; e[indj][len[indj]++]=hor;
e[hor][len[hor]++]=indj;
}
for(int k=2;k<4;k++){
int txk=x+dx[k],tyk=y+dy[k];
if(!inmaz(txk,tyk)||maz[txk][tyk]!='W')continue;
int indk=ind[txk][tyk],gra=lenw+2*i;
e[indk][len[indk]++]=gra;
e[gra][len[gra]++]=indk;
}
}
int res=match();
if(res!=lenw)puts("NO");
else puts("YES");
}
return 0;
}
UVALive 5903 Piece it together 二分匹配,拆点 难度:1的更多相关文章
- UVALive 5903 Piece it together(二分图匹配)
给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB <==碎片 W 题目一看,感觉是精确覆盖(最近 ...
- UVALive - 7427 the math 【二分匹配】
题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVALive 5903 Piece it together
一开始用的STL一直超时不能过,后来发现AC的代码基本都用的普通邻接表,然后改了一下13s,T=T,效率太低了.然后把某大神,详情戳链接http://acm.hust.edu.cn/vjudge/pr ...
- ZOJ 3646 Matrix Transformer 二分匹配,思路,经典 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4836 因为要使对角线所有元素都是U,所以需要保证每行都有一个不同的列上有U,设 ...
- UVALive 6525 Attacking rooks 二分匹配 经典题
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4536">点击打开链接 题意: ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
- HDU-4619 Warm up 2 二分匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 一看就知道是二分匹配题目,对每个点拆点建立二分图,最后答案除2.因为这里是稀疏图,用邻接表处理. ...
- ZOJ 1654 二分匹配基础题
题意: 给你一副图, 有草地(*),空地(o)和墙(#),空地上可以放机器人, 机器人向上下左右4个方向开枪(枪不能穿墙),问你在所有机器人都不相互攻击的情况下能放的最多的机器人数. 思路:这是一类经 ...
- HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧
题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...
随机推荐
- (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换
深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...
- thinkcmf安装教程与目录结构详解 快速上手版
最近接了一个建站项目,要求用thinkcmf来搭建,ytkah在想php都大致一样吧,快速地下载安装包,可是!怎么安装呢?没看到安装指引文件或目录,查看了安装说明public目录做为网站根目录,入口文 ...
- java-mybaits-00101-基础安装配制
一.数据库安装 http://jingyan.baidu.com/article/363872ec2e27076e4ba16fc3.html 二.eclipse连接mysql http://jingy ...
- Openstack(十五)快速添加新计算节点
当后期添加新物理服务器作为计算节点,如果按照上面的过程安装配置的话会非常的慢,但是可以通过复制配置文件的方式快速添加. 15.1计算节点服务安装 #提前将yum仓库.防火墙.selinux.主机名.时 ...
- Java系列介绍
Java系列目录 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述函数 Java 7新增功能 Java应用程序中System.out. ...
- vue项目多页配置
文件目录 ├─build ├─config ├─dist │ └─static │ ├─css │ ├─img │ └─js ├─src │ ├─assets │ │ ├─img │ │ ├─js │ ...
- C题:A Water Problem(dp||搜索)
原题链接 解法一:递归 #include<cstdio> #include<algorithm> using namespace std; long long n,x,y; l ...
- python3 库pandas写入csv格式文件出现中文乱码问题解决方法
python3 库pandas写入csv格式文件出现中文乱码问题解决方法 解决方案: 问题是使用pandas的DataFrame的to_csv方法实现csv文件输出,但是遇到中文乱码问题,已验证的正确 ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- 2017-2018-1 JaWorld 第四、五周作业
2017-2018-1 JaWorld 第四.五周作业 两周工作内容 小组讨论并确定最终的app雏形 合作完成需求说明书 工作分工 成员 分工 比例 陈是奇 1.引言 8% 马平川 2.1-2.5 产 ...