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;}


原创粉丝点击