HDU 1507
来源:互联网 发布:向日葵之夜 知乎 编辑:程序博客网 时间:2024/06/13 19:59
题意:给你N*M的空地,其中有K块是草坪,问最多有多少块1*2的草坪能铺在空地上。。。
思路:先把空地保存在一个有x,y(行和列)的结构体理;
对能铺上1*2的i,j两点建边,以奇数或偶数(行加列)进行二分匹配。。。。
//HDU 1507#include<cstdio>#include<stdlib.h>#include<string.h>#include<string>#include<cmath>#include<iostream>#include <queue>#include <stack>#include<algorithm>#include<set>using namespace std;#define INF 1e8#define inf -0x3f3f3f3f#define eps 1e-8#define ll __int64#define maxn 100+10#define mol 100007int vis[maxn],a[maxn][maxn],ans[maxn],map[maxn][maxn],g[maxn];int k,n,m,sum,num;struct node{ int x,y;}p[maxn*maxn];int dfs(int id){ for(int i=1;i<num;i++) { if(!vis[i]&&a[id][i]) { vis[i]=1; if(ans[i]==-1||dfs(ans[i])) { ans[i]=id; return 1; } } } return 0;}void match(){ sum=0;memset(ans,-1,sizeof(ans)); for(int i=1;i<num;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; }}int main(){ int i,j; int t; while(scanf("%d%d",&n,&m)) {if(!n&&!m) break; int u,v; memset(a,0,sizeof(a)); memset(map,0,sizeof(map)); scanf("%d",&k); while(k--) { scanf("%d%d",&u,&v); map[u][v]=1; } num=1; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(map[i][j]==0) { p[num].x =i; p[num++].y=j; } } } for(int l=1;l<num;l++) { //cout<<i; for(j=l+1;j<num;j++) { if((abs(p[l].x-p[j].x)==1&&p[l].y==p[j].y)||(abs(p[l].y-p[j].y )==1&&p[l].x==p[j].x)) { if((p[l].x+p[l].y)%2==0) a[j][l]=1; else a[l][j]=1; } } } match(); printf("%d\n",sum); for(i=0;i<num;i++) { if(ans[i]!=-1) { printf("(%d,%d)--(%d,%d)\n",p[i].x,p[i].y,p[ans[i]].x,p[ans[i]].y); } } printf("\n"); } return 0;}
0 0
- HDU 1507
- HDU 1507
- hdu 1507
- hdu 1507 (最大匹配)
- hdu 1507 二分匹配
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- 深入Java集合学习系列:HashMap的实现原理
- 写在头上,以此纪念我的程序人生!
- C语言文件编程
- 使用格式控制符进行输出格式的设置(讲解)
- 百度编辑器ueditor的部署和二次开发
- HDU 1507
- jsp 使用自定义标签时候错误
- 数据结构之循环队列
- 关于JAVA里面赋值的问题
- cocos2d-x v3.0beta2使用cocostudio制作的动画
- UIButton 触发多个事件 响应同一函数
- 迷宫之广度优先搜索
- 使用Aspose.Cells生成Excel
- hdu 2372 El Dorado(dp)