二分图之最小边覆盖(poj3020)
题目:poj3020
题意:给出一个图,让你用最少的1*2的纸片覆盖掉图中的全部*出现过的地方。
基本裸的最小边覆盖。
分析:
最小边覆盖 = 点总数 - 最大匹配
所以就是转化为求最大匹配。
跟前面一道题目非常相似,也是同样的建图方法,奇偶性建图。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1200;
#define Del(x,y) memset(x,y,sizeof(x))
int map[N][N],link[N],vis[N],vlink[N];
char path[50][50];
int line[50][50];
int n,m,t,tmp1,tmp2;
bool dfs(int x)
{
for(int i=1; i<tmp2; i++)
{
if(map[x][i]==1 && vis[i]==0)
{
vis[i]=1;
if(link[i]==-1 || dfs(link[i]))
{
link[i]=x;
return true;
}
}
}
return false;
}
void solve()
{
int ans=0;
Del(link,-1);
for(int i=1; i<tmp1; i++)
{
Del(vis,0);
if(dfs(i))
ans++;
}
//printf("%d\n",ans);
printf("%d\n",tmp1+tmp2-ans-2);
}
int main()
{
int T;
scanf("%d",&T);
//freopen("Input.txt","r",stdin);
while(T--)
{
scanf("%d%d",&n,&m);
Del(path,0);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
scanf("%c",&path[i][j]);
}
Del(line,-1);
tmp1=1,tmp2=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(path[i][j]=='*')
{
if((i+j)%2==0)
line[i][j]=tmp1++;
else
line[i][j]=tmp2++;
}
}
} Del(map,0);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(path[i][j]=='*' && (i+j)%2==1)
{
if(line[i-1][j]>=1)
map[line[i-1][j]][line[i][j]]=1;
if(line[i+1][j]>=1)
map[line[i+1][j]][line[i][j]]=1;
if(line[i][j-1]>=1)
map[line[i][j-1]][line[i][j]]=1;
if(line[i][j+1]>=1)
map[line[i][j+1]][line[i][j]]=1;
}
}
}
solve();
}
return 0;
}
二分图之最小边覆盖(poj3020)的更多相关文章
- PKU 3020 Antenna Placement(拆点+最小边覆盖)(最大匹配)
题目大意:原题链接 一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 提示:看清楚题目,' ...
- POJ3020 Antenna Placement —— 最大匹配 or 最小边覆盖
题目链接:https://vjudge.net/problem/POJ-3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K ...
- POJ3020(最小边覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8924 Accepted: 4428 ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- [置顶] 白话最小边覆盖总结--附加 hdu1151结题报告
刚开始看到这个题目的时候就觉得想法很明了,就是不知道如何去匹配... 去网上看了不少人的解题报告,但是对于刚接触“最小边覆盖”的我来说....还是很困难滴....于是自己又开始一如以往学习“最大独立集 ...
- HDU1151:Air Raid(最小边覆盖)
Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数
点击打开链接 Konig定理:二分图的最小顶点覆盖数 = 二分图的最大匹配数 题意: 在N*N的网络中有K颗小行星.小行星i的位置是(Ri, Ci).如今有一个强力的武器可以用一发光束将一整行或一整列 ...
- J - Air Raid - hdu 1151(最小边覆盖)
题意:给一个有向无环图,求出来最少需要几个士兵可以遍历所有的边. 分析:有向无环图的最小边覆盖 = 点数 - 最大匹配数 为什么是这样的公式??可以思考一下,如果这N个点之间没有边,是不是应该有N个士 ...
- POJ 1422 Air Raid(二分图匹配最小路径覆盖)
POJ 1422 Air Raid 题目链接 题意:给定一个有向图,在这个图上的某些点上放伞兵,能够使伞兵能够走到图上全部的点.且每一个点仅仅被一个伞兵走一次.问至少放多少伞兵 思路:二分图的最小路径 ...
随机推荐
- ASM学习笔记--ASM 4 user guide 第一章翻译
ASM是什么? 借用别人的话 :ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能. ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机 ...
- Altium Designer中的粉红色网格和绿色框框
- HttpWatch--简介及使用技巧
一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功 ...
- change_names
DC在储存网表时,有时会采用特殊的字符 比如表示总线BUS[7]-BUS[0] 会表示成\BUS[7] \BUS[6]...... 在compile命令之后,write命令之前 加上:chan ...
- 【Codeforces Round #445 (Div. 2) A】ACM ICPC
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 三重循环 [代码] #include <bits/stdc++.h> using namespace std; int ...
- 安装后,挂载c盘失败
现象: 安装后,window C盘mount失败 错误内容如下: Error mounting: mount exited with exit code 13: ntfs_attr_pread_i: ...
- 3D游戏《龙心传奇Dragona》全套完整源码
<龙心传奇Dragona>全套完整源码,<Dragona Online>也叫<龙心传奇>是一款3D中古奇幻风格网络游戏,描写叙述一个充满剑.魔法.恶魔和龙的魔法大陆 ...
- self.view.layer.contents 和 self.view.backgroundColor
一. self.view.layer.contents 和 self.view.backgroundColor 今天测了一下 : self.view.layer.contents 和 self. ...
- ASCII码的问题
数字0在ASCII的不同进制下表示:
- 25、写一个USB摄像头驱动程序(有ioctrl分析)
videobuf2-core.h中的vb2_buffer,记录了v4l2_buffer ,驱动可以对vb2_buffer的v4l2_buffer进行操控, vb2_buffer是v4l2框架层的代码, ...