题目大意:

  统计相邻(上下左右)的‘#’的对数。

解法:

  与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图。就是行+列为奇数的作为X集合,偶尔作为Y集合,都是‘#’就连边。最后求最大匹配。

  数据有点大,直接建图会出错(我试过)。可以按照‘#’出现的顺序给顶点编号。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int N=36005,INF=0x3f3f3f3f;
int cx[N],cy[N],dx[N],dy[N];
bool bmask[N];
vector<int > bmap[N];
int nx,ny,dis,ans;
bool searchpath()
{
queue<int> q;
dis=INF;
memset(dx,-1,sizeof(dx));
memset(dy,-1,sizeof(dy));
for(int i=1;i<=nx;i++)
{
if(cx[i]==-1){ q.push(i); dx[i]=0; }
while(!q.empty())
{
int u=q.front(); q.pop();
if(dx[u]>dis) break;
for(int i=0;i<bmap[u].size();i++)
{
int v=bmap[u][i];
if(dy[v]==-1)
{
dy[v]= dx[u] + 1;
if(cy[v]==-1) dis=dy[v];
else
{
dx[cy[v]]= dy[v]+1;
q.push(cy[v]);
}
}
}
}
}
return dis!=INF;
}
int findpath(int u)
{
for(int i=0;i<bmap[u].size();i++)
{
int v=bmap[u][i];
if(!bmask[v]&&dy[v]==dx[u]+1)
{
bmask[v]=1;
if(cy[v]!=-1&&dy[v]==dis) continue;
if(cy[v]==-1||findpath(cy[v]))
{
cy[v]=u; cx[u]=v;
return 1;
}
}
}
return 0;
}
void maxmatch()
{
ans=0;
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
while(searchpath())
{
memset(bmask,0,sizeof(bmask));
for(int i=1;i<=nx;i++)
if(cx[i]==-1) ans+=findpath(i);
}
}
void init()
{
for(int i=0;i<=N;i++) bmap[i].clear();
}
char s[605][605];
int Map[605][605];
int main()
{
//freopen("test.txt","r",stdin);
int cas,n,i,j,k=1,a,b,t=1;
char ch;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
t=0;
for(i=1;i<=n;i++){
getchar();
for(j=1;j<=n;j++)
{
scanf("%c",&s[i][j]);
if(s[i][j]=='#') Map[i][j]=++t;
}
}
init();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(s[i][j]=='#'&&((i+j)%2))
{
a=Map[i][j];
if(i>1&&s[i-1][j]=='#'){
b=Map[i-1][j];
bmap[a].push_back(b);
}
if(i<n&&s[i+1][j]=='#'){
b=Map[i+1][j];
bmap[a].push_back(b);
}
if(j>1&&s[i][j-1]=='#'){
b=Map[i][j-1];
bmap[a].push_back(b);
}
if(j<n&&s[i][j+1]=='#'){
b=Map[i][j+1];
bmap[a].push_back(b);
}
}
}
}
nx=t;
maxmatch();
printf("Case %d: %d\n",k++,ans);
}
return 0;
}

4185 Oil Skimming 最大匹配 奇偶建图的更多相关文章

  1. HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】

    Oil Skimming Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  2. hdu 4185 Oil Skimming(二分图匹配 经典建图+匈牙利模板)

    Problem Description Thanks to a certain "green" resources company, there is a new profitab ...

  3. HDU4185 Oil Skimming —— 最大匹配

    题目链接:https://vjudge.net/problem/HDU-4185 Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  4. HDU 4185 Oil Skimming 【最大匹配】

    <题目链接> 题目大意: 给你一张图,图中有 '*' , '.' 两点,现在每次覆盖相邻的两个 '#' ,问最多能够覆盖几次. 解题分析: 无向图二分匹配的模板题,每个'#'点与周围四个方 ...

  5. LightOJ--1152--Hiding Gold(二分图奇偶建图)(好题)

    Hiding Gold Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submit Sta ...

  6. HDU 4185 Oil Skimming

    题目大意:在一个N*N的矩阵里寻找最多有多少个“##”(横着竖着都行).     题目分析:重新构图,直接以相邻的两个油井算中间算以条边,然后进行匹配,看看两两之间最多能匹配多少对. #include ...

  7. (匹配 二维建图) Antenna Placement --POJ --3020

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...

  8. HDU4185:Oil Skimming(二分图最大匹配)

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

    如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...

随机推荐

  1. Apex语言(八)类和对象

    1.类和对象 一切皆对象,是客观存在的万物,有标识.属性和行为.一个人,一台电脑,一辆轿车都是对象 类是创建对象的模板或蓝图,是对象的抽象,是对象的类型. 一个对象是一个类的一个实例,是一个类的变量. ...

  2. 终于等到你!微软正式上线 Windows Terminal 预览版

    前一段时间,一直在知乎.技术社区收到技术小伙伴们的终极拷问:微软Build 大会上提到的**6月中旬**要上Windows store 的 Windows Terminal 到底啥时候可以用到呀? 有 ...

  3. C语言开发框架、printf(day02)

    C语言里包含以.c作为扩展名的文件,这种 文件叫源文件.C语言程序的绝大部分内容 应该记录在源文件里. C语言里还包括以.h作为扩展名的文件,这种 文件叫头文件. C语言程序里可以直接使用数字和加减乘 ...

  4. node源码详解(四)

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource4 本博客同步在https://cnodejs.o ...

  5. vue 对图片进行拖拽到另一个位置

    1.拖动元素代码: 使用html5原生拖拽属性,在需要拖拽的图片中添加draggable="true"属性,并使用v-on添加拖动事件 2.被放置的区域事件代码: 使用html5原 ...

  6. python3实现UDP协议的简单服务器和客户端

    利用python中的socket模块中的来实现UDP协议,这里写一个简单的服务器和客户端.为了说明网络编程中UDP的应用,这里就不写图形化了,在两台电脑上分别打开UDP的客户端和服务端就可以了. UD ...

  7. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/article/details/79506484 题目链接: (Lu ...

  8. lucene_04_解析语法查询

    解析语法查询就是调用方法查询的原始查询 例如: 查询所有的查询器的语法为:*:*,因为lucene查询是根据term来做的,既是:key:value类型.*:*表示所有域中的所有值. api调用语法解 ...

  9. [bzoj2588][Spoj10628]Count on a tree_主席树

    Count on a tree bzoj-2588 Spoj-10628 题目大意:给定一棵n个点的树,m次查询.查询路径上k小值. 注释:$1\le n,m\le 10^5$. 想法:好像更博顺序有 ...

  10. Ruby 教程

    Ruby 教程 http://www.runoob.com/ruby/ruby-tutorial.html http://guides.rubyonrails.org/getting_started. ...