POJ 2446 Chessboard (二分匹配)
2014-04-24 20:37
357 查看
#include<stdio.h> #include<math.h> #include<string.h> #define maxn 1050//表示x集合和y集合中顶点的最大个数 int nx,ny;//x集合和y集合中顶点的个数 int edge[maxn][maxn];//edge[i][j]为1表示ij可以匹配 int cx[maxn],cy[maxn];//用来记录x集合中匹配的y元素是哪个 int visited[maxn];//用来记录该顶点是否被访问过 int path(int u) { int v; for(v=0;v<=ny;v++) { if(edge[u][v]&&!visited[v]) { visited[v]=1; if(cy[v]==-1||path(cy[v]))//如果y集合中的v元素没有匹配或者是v已经匹配,但是从cy[v]中能够找到一条增广路 { cx[u]=v;//这是无向图中才要的 cy[v]=u; return 1; } } } return 0; } int maxmatch() { int res=0,i; for(i=0;i<maxn;i++) cx[i]=cy[i]=-1;//初始值为-1表示两个集合中都没有匹配的元素! for(i=0;i<=nx;i++) { if(cx[i]==-1) { memset(visited,0,sizeof(visited)); res+=path(i); } } return res; } int main() { int i,j,x,y,ans,n,m,k,s; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { ny=nx=n*m; memset(edge,0,sizeof(edge)); s=1; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(i>1)edge[s-m][s]=1; if(i<n)edge[s+m][s]=1; if(j>1)edge[s][s-1]=1; if(j<m)edge[s][s+1]=1; s++; } for(i=0;i<k;i++) { scanf("%d%d",&y,&x); s=(x-1)*m+y; //printf("s=%d\n",s); if(x>1)edge[s-m][s]=edge[s][s-m]=0; if(x<n)edge[s+m][s]=edge[s][s+m]=0; if(y>1)edge[s][s-1]=edge[s-1][s]=0; if(y<m)edge[s][s+1]=edge[s+1][s]=0; } /*for(i=1;i<=m*n;i++) for(j=1;j<=m*n;j++) { if(edge[i][j]) printf("i=%d,j=%d,edge==%d\n",i,j,edge[i][j]); }*/ /*for(i=0;i<nx;i++) for(j=0;j<ny;j++) if(edge[i][j])printf("%d-->%d\n",i,j);*/ ans=maxmatch(); if(ans==m*n-k)printf("YES\n"); else printf("NO\n"); //printf("%d\n",ans); } return 0; }
View Code
给图中每个格子编号,然后将之放入二分匹配中的两个集合里面,再将能连接即能覆盖的两个点连接起来。接下来就是模板的力量了。。。。赶脚这个构图法会是最猥琐的没有之一。
http://poj.org/problem?id=2446
相关文章推荐
- Poj 2446 Chessboard 【二分匹配+经典建图模型】
- 【POJ】2446 Chessboard 二分匹配
- POJ 2446 Chessboard(二分匹配-hungary)
- 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 2446 Chessboard(二分图最大匹配)
- POJ 2446 Chessboard(奇偶建点法+最大匹配)
- POJ 2446Chessboard(二分图最大匹配)
- POJ 2446 Chessboard(二分图最大匹配)