题意:

给定m*n的棋盘,有若干只咕咕。希望去掉一部分咕咕使得剩下的咕咕在上下左右四个方向越过咕咕槽的情况下都看不到咕咕。

思路:

建立一个二分图的方法有很多,这里采用xy二分。

假设没有咕咕槽的情况下,咕咕的最大放置数其实有点像八皇后问题,当然这里我们用最大匹配的思路求解。

当一个位置上放置了咕咕,那么其坐标(x,y)便被移除了待选集合,由此可见,如果建立一个X和Y的二分图,那么最大咕咕数就是二分图的最大匹配。

有锅的时候,相比于没有锅的时候难度增加在了怎么建边上,我们仍然想通过编号的方式建边,那么对于每个横向、竖向区域便可以可以用他们最左边\最右边的区域的编号代替,将其建边求最大二分匹配即可。(说见了就是锅的右边行+1,锅的下边列+1)。

//https://blog.csdn.net/sotifish/article/details/48396087
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int maxn = 10005;
vector<int> G[maxn];
char s[maxn][maxn];
bool vis[maxn];
int match[maxn];
int n, m; void add_edge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
} bool dfs(int u) {
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!vis[v]) {
vis[v] = true;
if (match[v] < 0 || dfs(match[v])) {
match[v] = u;
return true;
}
}
}
return false;
} int main()
{
scanf("%d%d", &n, &m);
memset(match, -1, sizeof(match));
for (int i = 0; i < n; i++) {
scanf("%s", s[i]);
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (s[i][j] == 'o') {
int x = i, y = j;
while (x > 0 && s[x - 1][j] != '+') x--;
while (y > 0 && s[i][y - 1] != '+') y--;
add_edge(x*m + j, i*m + y + m*n);
if (s[i][j] == 'o')cnt++;
}
}
}
int res = 0, num;
for (int i = 0; i < n*m; i++)
{
memset(vis, false, sizeof(vis));
if (dfs(i)) res++;
}
if (cnt <= res || cnt == 0) num = 0;
else num = cnt - res;
printf("%d\n", num);
return 0;
}

POJ2226(二分图建图/最小点覆盖)的更多相关文章

  1. HDU1150 Machine Schedule(二分图最大匹配、最小点覆盖)

    As we all know, machine scheduling is a very classical problem in computer science and has been stud ...

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

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

  3. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  4. 最大流任务调度——hdu3572二分图建图

    很简单的任务调度模板题 把一个工作完成一天的量当做是边 /* 任务调度问题最大流 因为两个任务之间是没有关系的,两天之间也是没有关系的 所以抽象成二分图 任务i在天数[si,ei]之间都连一条双向边, ...

  5. POJ 3041 Asteroids(二分图 && 匈牙利算法 && 最小点覆盖)

    嗯... 题目链接:http://poj.org/problem?id=3041 这道题的思想比较奇特: 把x坐标.y坐标分别看成是二分图两边的点,如果(x,y)上有行星,则将(x,y)之间连一条边, ...

  6. P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]

    这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...

  7. hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. SPOJ-OPTM Optimal Marks ★★(按位建图 && 最小割)

    [题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...

  9. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...

随机推荐

  1. LwIP与IPv6

    2.0.0中才开始支持IPv6,在此版本中改写了SNMP,但还没有IPv6的统计量.目前最新版本是2.0.2,其中SNMP也没有IPv6统计量(哪些?与IP的统计量有何区别?) 1.4.1中虽然有ip ...

  2. pyhton项目和晋江文学城数据分析项目

     1.图书管理系统 图1.图书管理系统(作者信息列表页面) 图2.图书管理系统(作者信息修改页面) 2.个人博客网页设计 图3.博客(我的日记-->个人日记)页面 图4.博客(关于我--> ...

  3. Oracle导出警告&ldquo;EXP-00003: 未找到段 (0,0) 的存储定义&rdquo;解决

    环境:CentOS7.4   Oracle11.2.0.4(搭建rac集群) 问题描述:在使用exp命令执行导出的时候,部分表提示“EXP-00003: 未找到段 (0,0) 的存储定义”警告. 问题 ...

  4. 【Mac电脑新手技巧】苹果电脑如何更换用户头像?

    想给Mac电脑换一个喜欢的用户头像?苹果电脑的用户头像如何更换? 对于很多Mac小白来说,给自己的Mac换一个可心的用户头像很是必要.但是,大多数Mac新手都觉得无从下手!如果你也想给自己的Mac换一 ...

  5. vue 3.0 项目搭建移动端 (六) 命名路由同级控制

    const Tabbar = () => import('@/components/Tabbar'); export default [ { path: '/', name: 'home', c ...

  6. rxjs简单的Observable用例

    import React from 'react'; import { Observable } from 'rxjs'; const FlowPage = () => { const onSu ...

  7. HTML单词

    html超文本标记语言 head 头部font 字体 字形i(italic) 倾斜,斜体字big 大的,字体加大hr 水平线Pre(predefined)预定义h5标题5Div(division)区隔 ...

  8. clientHeight offsetTop scrollTop

  9. Python2与Python3比较

    1.print 函数 1. print语句没有了,取而代之的是print()函数. Python 2.6与Python 2.7部分地支持这种形式的print语法. 2.Unicode 1.  在pyt ...

  10. Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组

    给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...