二分图——最小覆盖poj2226
详见进阶指南
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 1500
char mp[N][N];
int G[N][N],vis[N],match[N],n,m; bool dfs(int x){
for(int i=;i<=n;i++)
if(!vis[i] && G[x][i]){
vis[i]=;
if(!match[i] || dfs(match[i])){
match[i]=x;return ;
}
}
return ;
}
int work(){
int res=;
memset(match,,sizeof match);
for(int i=;i<=n;i++){
memset(vis,,sizeof vis);
if(dfs(i))res++;
}
return res;
} int cnt1,cnt2,id1[N][N],id2[N][N];//每个点对应的块序号
int main(){
for(int i=;i<=;i++)
for(int j=;j<=;j++)
mp[i][j]='.';
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("\n%c",&mp[i][j]);//这样很好用 //标记联通块
cnt1=,cnt2=;
memset(id1,,sizeof id1);
memset(id2,,sizeof id2);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]=='*'){
if(mp[i][j-]==mp[i][j])
id1[i][j]=id1[i][j-];
else id1[i][j]=++cnt1;
if(mp[i-][j]==mp[i][j])
id2[i][j]=id2[i-][j];
else id2[i][j]=++cnt2;
} //建图
memset(G,,sizeof G);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]=='*')
G[id1[i][j]][id2[i][j]]=;
n=max(cnt1,cnt2);
cout<<work()<<endl;
}
}
二分图——最小覆盖poj2226的更多相关文章
- 【UVA11419 训练指南】我是SAM 【二分图最小覆盖,最小割】
题意 给出一个R*C大小的网格,网格上面放了一些目标.可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标.你的任务是计算最少需要多少子弹,各从哪些位置发射,才能把所有目 ...
- 二分图最小覆盖的Konig定理及其证明,最小的覆盖证明
[转http://www.cppblog.com/abilitytao/archive/2009/09/02/95147.html -> http://yejingx.ycool.com/p ...
- [hdu2119]二分图最小覆盖,最大匹配
题意:给一个01矩阵,每次可以选一行或一列,打掉上面所有的1,求打掉所有的1所需的最小次数. 思路:经典的模型了,二分图最小覆盖=最大匹配.所谓最小覆盖是指选最少的点关联所有的边.容易得到将行和列看成 ...
- uva11419 二分图--最小覆盖=最大匹配
大白书355 // UVa11419 SAM I AM // Rujia Liu #include <cstdio> #include <cstring> #include & ...
- SCU 4439 Vertex Cover(二分图最小覆盖点)题解
题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...
- POJ 2226 二分图最小覆盖
题意: 思路: 把横着的连通块放在一个集合 竖着的放在一个集合 如果有交 就连边 求最小覆盖即可 (数值上等于最大匹配) //By SiriusRen #include <cstdio> ...
- POJ1325 Machine Schedule 【二分图最小顶点覆盖】
Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11958 Accepted: 5094 ...
- POJ 3041 Asteroids(二分图最大匹配)
###题目链接### 题目大意: 给你 N 和 K ,在一个 N * N 个图上有 K 个 小行星.有一个可以横着切或竖着切的武器,问最少切多少次,所有行星都会被毁灭. 分析: 将 1~n 行数加入左 ...
- POJ Muddy Fields 泥泞的牧场 二分图
Muddy Fields Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13235 Accepted: 4879 汪星人 ...
随机推荐
- 使用Beyond Compare作为Perforce默认的文件比较工具
使用perforce自带的文件比较工具有时候会遇到乱码的情况,如下: 暂时不知道如何解决上述问题,因此想换个文件比对工具,比如Beyond Compare. 设定位置:Edit->prefere ...
- Neo4j模糊查询及分页查询
Neo4j模糊查询:采用正则方式: MATCH (n:House) where n.Name =~ '李.*' RETURN n 分页: 使用skip 及 limit MATCH (n:House) ...
- ubontu 16 下的 pylon5 安装
想用wine,然后走了很多弯路.后来发现正确的安装和配置pylon即可.注意32位和64位不可以混淆. If you choose to install in a different director ...
- 【Wikioi】P1401 逆序统计 代码
题目链接:http://wikioi.com/solution/list/1401/ 题解链接:http://user.qzone.qq.com/619943612/blog/1377265690 代 ...
- c++隐藏运行exe黑窗口
加入main方法隐藏窗口 HWND hwndDOS = GetForegroundWindow(); ShowWindow(hwndDOS, SW_HIDE);
- LeetCode动态规划题总结【持续更新】
以下题号均为LeetCode题号,便于查看原题. 10. Regular Expression Matching 题意:实现字符串的正则匹配,包含'.' 和 '*'.'.' 匹配任意一个字符,&quo ...
- arc098E Range Minimum Queries
题意:给你一个n个数的数组,每次能够选取连续的长度为K的子序列,取出其中任意一个最小元素. 一共操作Q次.问取出的元素中Max-Min最小是多少? 标程: #include<bits/stdc+ ...
- colormap 参数及对应色卡
[参考] [1]matlab帮助文档
- php 扫描url死链接 \033[31m ANSI Linux终端输出带颜色
* 从Packagist上搜索需要的包 https://packagist.org/ * 通过composer下载依赖包 composer require guzzlehttp/guzzlecompo ...
- eclipse+terminal
eclipse 怎么安装terminal插件 1 首先打开eclipse,找到help菜单,点击Eclipse Marketplace. 2 在search框里输入Terminal,点击Go查找. ...