/*
题意:给你一些冰岛。公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响
求选尽可能多的选一些公共海域点每行每列仅能选一个。
限制条件:冰山可以隔开这个限制条件。即*#*可以选两个
预处理:
*****
**#*#
*****   可以按行转化  *****
**#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;}

转载于:https://www.cnblogs.com/thefirstfeeling/p/4410563.html

hdu 5093 二分匹配相关推荐

  1. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...

  2. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...

  4. HDU - 3081 Marriage Match II 【二分匹配】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...

  5. HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)

    题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...

  6. HDU 5943 2016CCPC杭州 K: Kingdom of Obsession(二分匹配)

    题意:给你一张二分图,左边是s+1到s+n这n个数,右边是1到n这n个数 如果x在左边,y在右边,且x%y==0,那么x可以和y匹配,问这个二分图是否存在完美匹配 如果左边有两个以上的质数出现,那么一 ...

  7. HDU 6178 Monkeys(树上的二分匹配+fread)

    题目地址 题意:你有n个节点,n-1条边构成一棵树,有m个猴子,猴子要在节点上,并且每个猴子至少要和另一只猴子有边相连,求最多需要多少条边 思路:最好的应该是猴子都是两两匹配的,因为每2个猴子相连的话 ...

  8. hdu 1045Fire Net (建图 、二分匹配)

    题意:需要求最大的放置炮台数(每个炮台都不能在其他炮台攻击范围内). 炮台攻击范围是:该炮台所在的行和列,但是'X'可以阻挡炮台攻击. 思路:二分匹配必须要有两个互不关联的集合,所以可以将行和列看做两 ...

  9. hdu 1281(二分图匹配+增广路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 解题思路: 把棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是 ...

最新文章

  1. 各种抠图动态图片_学习抠取动物毛发图片的PS抠图技巧
  2. 利用服务器修改服务器数据,用Jquery实现可编辑表格并用AJAX提交到服务器修改数据...
  3. fileinput 图片上传
  4. Android中TextView中string的特殊符号显示的方法
  5. JavaScript中的元素获取与操作
  6. PaaS、DevOps、OpenShift与业务中台的实现
  7. 【有奖征文】WEB前端大作战,走在技术最前端!
  8. Leetcde每日一题:160.intersection-of-two-linked-lists(相交链表)
  9. 美国红帽软件公司是做什么的
  10. oracle 10G表空间创建的步骤
  11. 腾讯自然语言处理实习面经
  12. 第7章—SpringMVC高级技术—不用web.xml,而使用java类配置SpringMVC
  13. 正态分布的前世今生(上)
  14. android 手机型号 命名规则,自己整理:各大品牌安卓手机的型号命名规律
  15. 基于java jsp的大学生奖学金管理系统
  16. 【Unity】Unity5.0之PBR/PBS详解
  17. SV绿皮书笔记(九)暂时完结
  18. linux wifi名称设置中文乱码,无线wifi名称怎么改成中文乱码的方法
  19. 《安富莱嵌入式周报》第283期:全开源逆向“爆破”硬件工具,Linux内核6.1将正式引入RUST语言,I3C培训教程,80款市场成熟的电感式位置传感器设计
  20. 移动支付之支付宝支付

热门文章

  1. 【快乐水题】1725. 可以形成最大正方形的矩形数目
  2. java中继承、多接口实现
  3. 解决Docker上安装RabbitMQ后Web管理页面打不开的问题
  4. python 图片上传到minio时,在minio不是显示图片格式
  5. 国家电网和南方电网还傻傻分不清?
  6. STM32开发 -- 状态机与状态切换逻辑
  7. UNIX再学习 -- exec 函数族
  8. Get Cache Info in Linux on ARMv8 64-bit Platform
  9. Linux Used内存到底哪里去了?
  10. Android 插件框架实现思路及原理