hdu 5093 二分匹配
/*
题意:给你一些冰岛。公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响
求选尽可能多的选一些公共海域点每行每列仅能选一个。
限制条件:冰山可以隔开这个限制条件。即*#*可以选两个
预处理:
*****
**#*#
***** 可以按行转化 *****
**#oo
ooo*#
***** 按行转化的基础上按列转化
***o**o
**ooooo
oooo*oo
**o**o*
因为每行每列顶多可以增加50
所以总共最多2500*2500的矩阵
然后直接二分匹配即可
*/
#include<stdio.h>
#include<string.h>
#define N 2800
int ma[N][N];
char s[60][60];
int ans[N][N];
int n,m,addx,addy;
void slovex() {//按行转化
int i,k;
addx=0;
for(i=1;i<=n;i++) {
addx++;
//printf("%d\n",addx);
k=1;
while(1) {
for(;s[i][k]!='#'&&k<=m;k++) {
if(s[i][k]=='*')
ans[addx][k]=1;
}
if(k==m)//最后一个也要算进去,刚开始这里错了一直没看出来重要*****
ans[addx][k]=2;
if(k==m+1||k==m)
break;
ans[addx][k]=2;
k++;
addx++;
}
}
return ;
}
void slovey() {//在按行转化的基础上按列转化
int i,k;
addy=0;
for(i=1;i<=m;i++) {
addy++;
k=1;
// printf("%d\n",addy);
while(1) {
for(;ans[k][i]!=2&&k<=addx;k++) {
if(ans[k][i]==1)
ma[k][addy]=1;
}
if(k==addx+1||k==addx)
break;
k++;
addy++;
}
}
return;
}
int vis[N],link[N];
int findd(int u) {
int i;
for(i=1;i<=addy;i++)
if(ma[u][i]&&vis[i]==0) {
vis[i]=1;
if(link[i]==-1||findd(link[i])) {
link[i]=u;
return 1;
}
}
return 0;
}
int main() {
int t,i,sum,j;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
memset(ma,0,sizeof(ma));
memset(ans,0,sizeof(ans));
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
slovex();
/* for(i=1;i<=addx;i++) {
for(j=1;j<=m;j++)
printf("%d ",ans[i][j]);
printf("\n");
}*/
slovey();
/* for(i=1;i<=addx;i++) {
for(j=1;j<=addy;j++)
printf("%d ",ma[i][j]);
printf("\n");
}*/
memset(link,-1,sizeof(link));
sum=0;
for(i=1;i<=addx;i++) {//直接套模板二分匹配即可
memset(vis,0,sizeof(vis));
sum+=findd(i);
}
printf("%d\n",sum);
}
return 0;}
hdu 5093 二分匹配的更多相关文章
- Battle ships HDU - 5093二分匹配
Battle shipsHDU - 5093 题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间 ...
- hdu 4169 二分匹配最大独立集 ***
题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 #inclu ...
- hdu 4685 二分匹配+强连通分量
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...
- H - Prince and Princess - HDU 4685(二分匹配+强连通分量)
题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备 ...
- HDU 3729 二分匹配 反向匹配
题意: 给定 n个学生 说的 自己 考试排名的 可能范围 确定最多几个人说真话 如果有多种答案,输出字典序最大的那种( 要求字典序最大,所以solve中从最大字典序开始匹配) 思路: 题目给定 点 ...
- HDU -1151 二分匹配与有向无环图不相交最小路径覆盖数
题意: 考虑一个小镇,那里的所有街道都是单向的,并且每条街道都从一个路口通往另一个路口.还众所周知,从一个十字路口开始,穿过城镇的街道,您将永远无法到达同一十字路口,即,城镇的街道没有环. 基于这些假 ...
- HDU 2603 二分匹配
#include <queue>#include <vector>#include <cstdio>#include <cstring>#include ...
- hdu 1528 二分匹配
#include<stdio.h> #include<string.h> int map[100][100],mark[100],link[100],max2,k; int f ...
- Hdu 2389 二分匹配
题目链接 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Ja ...
随机推荐
- 187 Repeated DNA Sequences 重复的DNA序列
所有DNA由一系列缩写为A,C,G和 T 的核苷酸组成,例如:“ACGAATTCCG”.在研究DNA时,识别DNA中的重复序列有时非常有用.编写一个函数来查找DNA分子中所有出现超多一次的10个字母长 ...
- JDK常用类解读--String
一.字符串的不变性: 文章使用的源码是jdk1.8的.(下同) 1.首先可以看到`String`是`final`类,说明该类不可继承,保证不会被子类改变语义 2.String的值实际上就是一个字符数组 ...
- Windows Phone8.1应用 提交
昨天晚上,试了试把一个WP8.1应用提交到微软商店上去,期间遇到了不少问题,搞到凌晨还没弄好.今天早上,终于把WP8.1应用成功提交上去了. 下面说说如何把WP8.1应用提交商店去.提交WP8.1以及 ...
- 如何向妻子解释OOD (转)
此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不 ...
- mysql 字段包含某个字符的函数
通过sql查询语句,查询某个字段中包含特定字符串: 例子:查询e_book表的types字段包含字符串"3",有下面4种方式 select * from e_book where ...
- SugarCRM安装踩雷(一)
安装SugarCRM前置条件: 1.找对平台.正确版本的安装包 2.APACHE + MYSQL + TOMCAT环境先确保OK 坑1: 进入安装参数设置步骤的MYSQL用户密码——这里根据Mysql ...
- R in action读书笔记(11)-第八章:回归-- 选择“最佳”的回归模型
8.6 选择“最佳”的回归模型 8.6.1 模型比较 用基础安装中的anova()函数可以比较两个嵌套模型的拟合优度.所谓嵌套模型,即它的一 些项完全包含在另一个模型中 用anova()函数比较 &g ...
- 大写URL转小写
添加LowercaseRoutesMVC.dll引用.通过“管理—NuGet程序包”搜索LowercaseRoutesMVC,然后点击安装.安装成功后会自动引用LowercaseRoutesMVC.d ...
- Swift Intermediate Language (SIL)
Swift Intermediate Language (SIL) https://github.com/apple/swift/blob/master/docs/SIL.rst#witness-me ...
- Tensorflow入门-上
前置准备 在阅读本文之前,请确定你已经了解神经网络的基本结构以及前向传播.后向传播的基本原理,如果尚未了解,可以查看下文. 深度学习之神经网络 什么是TensorFlow? TensorFlow是Go ...