POJ 2226 二分图最小覆盖
来源:互联网 发布:linux更改文件权限777 编辑:程序博客网 时间:2024/06/11 23:24
题意:
思路:
把横着的连通块放在一个集合 竖着的放在一个集合
如果有交 就连边
求最小覆盖即可 (数值上等于最大匹配)
//By SiriusRen#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 2555*2555int n,m,first[2555],next[N],v[N],tot,cnt,change[55][55],changea[55][55],vis[2555],matched[2555],ans;char a[55][55];void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}bool dfs(int x){ for(int i=first[x];~i;i=next[i]){ if(!vis[v[i]]){ vis[v[i]]=1; if(!matched[v[i]]||dfs(matched[v[i]])){ matched[v[i]]=x; return 1; } } } return 0;}int main(){ memset(first,-1,sizeof(first)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ getchar(); for(int j=1;j<=m;j++) a[i][j]=getchar(); } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]=='*'){ if(a[i][j-1]=='*') changea[i][j]=changea[i][j-1]; else changea[i][j]=++cnt; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]=='*'){ if(a[i-1][j]=='*') change[i][j]=change[i-1][j]; else change[i][j]=++cnt; add(changea[i][j],change[i][j]); } for(int i=1;i<=cnt;i++){ memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } printf("%d\n",ans);}
0 0
- POJ 2226 二分图 最小点覆盖
- poj 2226 二分图最小点覆盖
- POJ 2226 二分图最小覆盖
- poj 2226 二分图最小点集覆盖
- poj 2226 二分图 最小顶点覆盖 “草泥马”
- poj 2226 二分图最小点集覆盖
- poj 2226-二分图的最小顶点覆盖
- poj 2226 二分图 最小点覆盖 , 最大流
- poj 2226 二分图 最小点覆盖模型
- POJ - 2226 Muddy Fields 二分图 最小点覆盖
- poj 2226 Muddy Fields 二分图最小点覆盖
- POJ-2226-Muddy Fields-二分图-最小点覆盖
- POJ 1325二分图,最小点覆盖
- poj 1422 二分图最小路径覆盖
- POJ 2060 最小路径覆盖 二分图
- poj 3020 二分图最小路径覆盖
- POJ 2594 二分图最小路径覆盖
- poj-3041【二分图最小顶点覆盖】
- altium designer 去掉PCB的所有连线
- 迷宫寻路
- 利用header下载图片等文件
- Mybatis学习总结五
- java图片开源框架tesseract调用OCR实现图片文件识别代码下载
- POJ 2226 二分图最小覆盖
- KMP算法
- 分析RunTime执行命令以及得到返回值
- Linux下 PostgreSQL 编译安装
- Ubuntu12.04 root 用户登录设置
- Hadoop学习笔记 压缩
- 解决问题:onreadystatechange只触发一次
- 安卓 组件Service知识理解
- C4.5决策树代码详细解析以及C4.5程序调用(正确的代码!!!)