codevs 1022 覆盖
来源:互联网 发布:dblp数据集 编辑:程序博客网 时间:2024/06/04 00:24
题目
分析:每2*1 让人想到了二分图,讲每个点上下左右是陆地的点连起来,跑匈牙利算法就好了。
#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=110;bool a[maxn][maxn],book[maxn*maxn];int num[maxn][maxn],cnt=0,dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1},match[maxn*maxn];vector<int>map[maxn*maxn];bool dfs(int s){book[s]=1;for(int i=0;i<map[s].size();++i){int v=match[map[s][i]];if(!v||!book[v]&&dfs(v)){match[s]=map[s][i];match[map[s][i]]=s;return 1;}}return 0;}int main(){int n,m;cin>>n>>m;int k;cin>>k;memset(a,1,sizeof(a));for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)a[i][j]=0;for(int i=1;i<=k;++i){int x,y;cin>>x>>y;a[x][y]=1;}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(!a[i][j]){num[i][j]=++cnt;}}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(!a[i][j]){for(int k=1;k<=4;++k){int xx=dx[k]+i,yy=dy[k]+j;if(!a[xx][yy]){map[num[i][j]].push_back(num[xx][yy]);}}}}}int ans=0;for(int i=1;i<=cnt;++i){if(match[i]!=0)continue;memset(book,0,sizeof(book));if(dfs(i))++ans;}cout<<ans;return 0;}
阅读全文
0 0
- Codevs 1022 覆盖
- codevs 1022 覆盖
- CODEVS 1022 覆盖 解题报告
- 【codevs 1022】覆盖(匈牙利算法)
- Codevs 多米诺+覆盖题解
- codevs 1214 线段覆盖
- 【codevs 1214】线段覆盖
- Codevs 1214 线段覆盖
- CODEVS 1214线段覆盖
- codeVS 1214 线段覆盖
- codevs 1214 线段覆盖
- 线段覆盖 CODEVS
- 线段覆盖2 CODEVS
- Codevs 1214 线段覆盖
- codevs 线段覆盖系列
- [CODEVS 3037] 线段覆盖 5
- codevs线段覆盖 动态规划
- Codevs 3027 线段覆盖2
- 面向对象的概念 | 类与对象 | java基础
- BFS E题
- 7种深度学习工具介绍
- MySQL命令行操作
- Python3学习(7)--函数【Function】
- codevs 1022 覆盖
- css禅院
- 开源项目
- Isomorphic Strings
- PHP 处理最普通的 XML 任务
- Android开发 手机测试运行报错1
- [绍棠_Swift] Swift3.0中自定义导航栏后侧滑返回功能失效
- Android 四大组件之 Service (下)
- QT Dom读xml文件