POJ_2446_Chessboard
2013-07-16 20:43
507 查看
题目意思就是一个M*N的有洞棋盘棋盘上,用1*2的板子去覆盖没有洞的地方,要求板子不能重叠,最终能否将棋盘完整覆盖。
代码:
我的思路大致是这样:
由于是将棋盘相邻两区域覆盖,所以可将棋盘黑白相间的涂色,然后再挖去相应的洞,这样,将白色的作为一个二分图节点子集,剩下的作为另一个子集,然后相邻的黑白块代表的顶点在二分图中连接起来,然后求出二分图的额最大匹配数,便是最多能够放置的板子。
代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 35 struct z { int color; int ct; }; struct z chess[MAX*MAX]; int lc,rc; int m,n;a __int64 hole[MAX*MAX]; __int64 G[MAX*MAX][MAX*MAX]; __int64 link[MAX*MAX]; __int64 vis[MAX*MAX]; int zero=0,one=0;/*分别记录0,1的个数*/ int find(int); void bin_map(void); int main(void) { int k,i,j; int x,y; scanf("%d%d%d",&m,&n,&k); for(i=0; i<k; i++) { scanf("%d%d",&x,&y); hole[n*(y-1)+x]=1; } if(n&1) for(j=1,i=1; i<=m*n; i++) { if(hole[i]==0) { chess[i].color=j=!j; if(j) chess[i].ct=++one; else chess[i].ct=++zero; } else { chess[i].color=-1; j=!j; } } else for(j=1,i=1; i<=m*n; i++) { if(hole[i]==0) { chess[i].color=!j; if(!j) chess[i].ct=++one; else chess[i].ct=++zero; } else chess[i].color=-1; if(i%n) j=!j; } bin_map(); int ans=0; for(i=1; i<=zero; i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } if(2*ans==m*n-k) puts("YES"); else puts("NO"); return 0; } void bin_map(void) { int i; for(i=1; i<=m*n; i++) { if(chess[i].color==0) { if(i%n!=1&&chess[i-1].color==1) G[chess[i].ct][chess[i-1].ct]=1; if(i%n&&chess[i+1].color==1) G[chess[i].ct][chess[i+1].ct]=1; if(i>n&&chess[i-n].color==1) G[chess[i].ct][chess[i-n].ct]=1; if(i<=m*n-n&&chess[i+n].color==1) G[chess[i].ct][chess[i+n].ct]=1; } } } int find(int x) { int i; for(i=1; i<=one; i++) { if(G[x][i]&&!vis[i]) { vis[i]=1; if(link[i]==0||find(link[i])) { link[i]=x; return 1; } } } return 0; }
我的思路大致是这样:
由于是将棋盘相邻两区域覆盖,所以可将棋盘黑白相间的涂色,然后再挖去相应的洞,这样,将白色的作为一个二分图节点子集,剩下的作为另一个子集,然后相邻的黑白块代表的顶点在二分图中连接起来,然后求出二分图的额最大匹配数,便是最多能够放置的板子。
相关文章推荐
- POJ 2446 Chessboard
- poj 2446 Chessboard (二分图利用奇偶性匹配)
- POJ 2446-Chessboard(二分图_最大匹配)
- poj 2446 Chessboard
- POJ 2446 Chessboard(二分图最大匹配)
- POJ 2446 Chessboard(二分图-网格图构图)
- Poj 2446 Chessboard 【二分匹配+经典建图模型】
- POJ 2446 Chessboard
- POJ_2446_Chessboard(二分图匹配)
- POJ 2446 Chessboard
- POJ 2446 Chessboard【二分图匹配】
- POJ 2446 : Chessboard(二部图算法)
- POJ 2446 Chessboard 匹配/最小路径覆盖
- poj Chessboard 2446 (最大匹配&转换)
- POJ 2446 Chessboard(二分图匹配)
- Poj 2446 Chessboard 匈牙利算法
- POJ 2446 Chessboard(二分图最大匹配)
- POJ_2446 Chessboard
- POJ 2446 Chessboard(二分图匹配)
- poj 2446 Chessboard 二分图最大匹配经典题