链接:

http://poj.org/problem?id=3020

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#problem/H

首先分别对顶点进行编号:空地用0表示.

1002

3400

0056

7890

接下来划分顶点集合

集合u:

1 2 4 5 8

集合v:

3 6 7 9

问题就是求这两个集合之间的最小路径覆盖.

最小路径覆盖 = 顶点个数 - 最大匹配数

建图时为了方便,如果顶点u和顶点v相邻,就认为g[u][v] = 1和g[v][u] = 1.也就是说两个顶点集都是由全部顶点组成的,这样求出来的最大匹配数将翻倍,所以最后计算的时候要除以2.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 510
#define INF 0x3f3f3f3f // un是匹配左边的定点数, vn是匹配右边的定点数
int n, m, un, vn, used[N], p[N], hash[N][N], g[N][N];
char G[N][N]; //匈牙利算法, 从左边开始找增广路
int Find(int u)
{
for(int j=; j<vn; j++)
{
if(!used[j] && g[u][j])
{
used[j] = ;
if(p[j]==- || Find(p[j]))
{
p[j] = u;
return true;
}
}
}
return false;
} //最大匹配数
int hungary()
{
int ans = ; memset(p, -, sizeof(p));
for(int i=; i<un; i++)
{
memset(used, , sizeof(used));
if(Find(i)) ans++;
}
return ans;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int i, j, tol=; scanf("%d%d", &n, &m);
memset(G, , sizeof(G));
memset(hash, , sizeof(hash));
memset(g, , sizeof(g));
for(i=; i<n; i++)
{
scanf("%s", G[i]);
for(j=; j<m; j++)
if(G[i][j]=='*')
hash[i][j]=tol++;
} for(i=; i<n; i++)
for(j=; j<m; j++)
{
if(G[i][j]=='*')
{
if(i> && G[i-][j]=='*') g[hash[i][j]][hash[i-][j]]=;
if(i<n- && G[i+][j]=='*') g[hash[i][j]][hash[i+][j]]=;
if(j> && G[i][j-]=='*') g[hash[i][j]][hash[i][j-]]=;
if(j<m- && G[i][j+]=='*') g[hash[i][j]][hash[i][j+]]=;
}
}
un = vn = tol;
printf("%d\n", tol-hungary()/); }
return ;
}

(匹配 二维建图) Antenna Placement --POJ --3020的更多相关文章

  1. Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

    题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数 ...

  2. Antenna Placement poj 3020

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12104   Accepted: 595 ...

  3. Antenna Placement POJ - 3020 (最小边集覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10699   Accepted: 526 ...

  4. Antenna Placement poj 3020(匹配)

    http://poj.org/problem?id=3020 题意:给定一个n*m的矩阵,'*'代表城市,现在想要用1*2的矩阵将所有的城市覆盖,问最少需要多少个矩阵? 分析:先为每个城市进行标号,再 ...

  5. (匹配)Antenna Placement --POJ --3020

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

  6. node 无脑生成小程序二维码图

    RT 新建createwxaqrcode.js: const request = require('request') const fs = require('fs') // eg:生成购物车列表圆形 ...

  7. pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)

    //2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...

  8. PHP生成有背景的二维码图,摘自网络

    有一天产品MM高高兴兴的走过来,兴奋的和我分享她想出来的一个新的idea. 产品MM:你看这个(她指了指她的手机),一脸兴奋 那是一张带着二维码的图片,内容如下: 她接着说:如果我们的分销也能做成类似 ...

  9. POJ 2226 Muddy Fields(二分匹配 巧妙的建图)

    Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R ...

随机推荐

  1. 解决IE下载 apk/ipa 变成zip:Android 手机应用程序文件下载服务器 配置解决方法

    解决IE apk/ipa变成zip:Android 手机应用程序文件下载服务器 配置解决方法 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Da ...

  2. Java操作Excel之Poi

    package com.java1234.poi; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSF ...

  3. PostgreSql别名区分大小写的问题

    PostgreSql是区分大小写的,如果别名的大小不一致就会提示错误: SELECT * FROM ( SELECT cpi."product_item_id" "PRO ...

  4. 将*.sql数据库脚本导入到sqlserver中(sql文件导入sqlserver)

    在SqlServer中这个是用生成sql脚本生成的 要是在导入数据库用数据导入/导出向导导不进去 其实要用查询分析器来打开sql文件 然后执行就可以了

  5. 迷你MVVM框架 avalonjs 1.3.6发布

    本版本是一次重要的升级,考虑要介绍许多东西,也有许多东西对大家有用,也发到首页上来了. 本来是没有1.36的,先把基于静态收集依赖的1.4设计出来后,发现改动太多,为了平缓升级起见,才减少了一部分新特 ...

  6. delphi XE3解析JSON数据

    测试数据如下: Memo1.text中的数据: { "date":"周二(今天, 实时:12℃)", "dayPictureUrl":&qu ...

  7. Clustered Index & Non Clustered Index(聚簇索引和非聚簇索引)

    每个表只能有一个聚簇索引,而能有200多个非聚簇索引. 在物理分配上, 每个表的数据都是分配在页上,一个页大概有8k左右,假设一条数据占1000字节的话,那么8000条数据占8000*1k/8k = ...

  8. compression

    compression - 必应词典 美[kəmˈpreʃ(ə)n]英[kəm'preʃ(ə)n] n.压缩:加压:压紧:浓缩 网络压迫:压力:加压包扎

  9. 最小重组缓冲区和路径MTU发现

    概括: 主要来源于unp,可参考:http://blog.csdn.net/ysu108/article/details/7764461 疑惑: 1. 最小重组缓冲区大小: ipv4为576,ipv6 ...

  10. Python反转

    1切片 s="svdfbffdbdf" a=s[::-1] 2入栈出栈 入栈之后再出栈正好就是了 3reverse 这个函数是列表的....你要先把str转成list list-& ...