一张残缺的棋盘,用1*2的矩形去覆盖它,要求矩形不互相重叠。
求矩形最多可以放多少个。
将棋盘染成黑白相间,黑色方格作为左边的点,白色方格作为右边的点,相邻的黑白方格中间连一条边。
对已经建好的图求最大匹配
#include<iostream> #include<cmath> using namespace std; #define MAXSIZE 34 int map[MAXSIZE][MAXSIZE]; int vis[MAXSIZE][MAXSIZE]; int xc[]={0,0,1,-1}; int yc[]={1,-1,0,0}; int m,n,k; int num; typedef struct point{ int x; int y; }point; point isWho[MAXSIZE*MAXSIZE]; int dfs(int x,int y) { for(int k=0;k<4;k++)//遍历四个方向的点 { int xt=x+xc[k]; int yt=y+yc[k]; if(map[xt][yt]==0) if(xt>=1&&yt>=1&&xt<=m&&yt<=n&&!vis[xt][yt])//在地图中 并且没有拜访过 { vis[xt][yt]=1; int temp=(xt-1)*32+yt; if((isWho[temp].x==-1&&isWho[temp].y==-1)||dfs(isWho[temp].x,isWho[temp].y))//没有人要 或者可以腾出来 { isWho[temp].x=x; isWho[temp].y=y; return 1; } } } return 0; } int main() { // freopen("in.txt","r",stdin); // while(scanf("%d%d%d",&m,&n,&k)!=EOF) { scanf("%d%d%d",&m,&n,&k); num=m*n; int i,j; memset(map,0,sizeof(map)); memset(isWho,-1,sizeof(isWho)); if((num-k)%2) { printf("NO\n"); return 0; } for(i=1;i<=k;i++) { int r,c; scanf("%d%d",&c,&r); map[r][c]=1; } int ans=0; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if((i+j)%2) { memset(vis,0,sizeof(vis));//清空 if(map[i][j]==0) if(dfs(i,j)) ans++; } } } // cout<<ans<<endl; if(ans*2==num-k) printf("YES\n"); else printf("NO\n"); } return 0; }
相关推荐
匈牙利算法是解决无权二分图最大匹配问题的经典算法之一。该算法的核心思想是通过不断寻找所谓的“增广路径”来逐步扩大匹配集M的大小,直到无法再找到增广路径为止。 **关键概念:** - **盖点**:指那些被当前匹配...
#### 1466 Girls and Boys - 二分图 (最大独立团) - **知识点**:最大独立团问题,在二分图中寻找最大的不相邻顶点集合。 #### 1469 COURSES - 二分匹配 - **知识点**:二分匹配算法。 #### 1502 MPI Maelstrom ...
- **内容**: 解决二分图最大匹配问题的算法。 - **示例题目**: poj1459, poj3436 - **知识点**: - **匈牙利算法**:一种高效的匹配算法,可以在多项式时间内找到一个二分图的最大匹配。 ### 三、数据结构 #### 1....
5. **二分图匹配**:匈牙利算法或Kuhn-Munkres算法用于求解二分图的最大匹配问题,广泛应用于配对问题。 6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际...
匈牙利算法是一种解决二分图最大匹配问题的有效算法。二分图(Bipartite Graph)是指一个图中的节点可以分为两个互不相交的集合,使得每条边都连接这两个集合中的一个节点与另一个节点。匈牙利算法主要应用于寻找...
- **定义**: 在二分图中寻找最大匹配,即两个不相交顶点集中的最大数量的边的集合。 - **应用场景**: 常见于资源分配、任务分配等问题。 - **示例题目**: - poj3041: 涉及到二分图匹配问题,适合用匈牙利算法解决。...
1. **二分图匹配**:匈牙利算法解决二分图的完美匹配问题。 2. **最小路径覆盖**:寻找图中最小的边集合,使得所有顶点至少包含一条路径。 3. **网络流**:最大流量问题,如最大流最小割定理。 4. **最小费用流**:...
- **二分图匹配**(匈牙利算法):解决二分图中最大匹配问题。 - **网络流**:解决最大流最小割问题,包括最小费用流。 - **线段树**:支持区间查询和更新操作的高效数据结构。 - **并查集**:用于维护一系列不相交...
1. **二分图匹配**:使用匈牙利算法解决二分图的完美匹配问题。 2. **最小路径覆盖**:寻找覆盖所有顶点的最小路径集合。 3. **网络流**:用于解决流量分配问题,包括最小费用流。 4. **线段树**:一种数据结构,...
在第二阶段,我们遇到更复杂的算法,如二分图匹配(匈牙利算法)、最小路径覆盖和网络流问题。网络流问题包括最大流和最小费用流,它们在资源分配和调度等领域有广泛应用。动态规划是解决许多问题的强大工具,例如...
3.5.3 二分图匹配 3.5.4 一般图匹配 3.5.5 匹配、边覆盖、独立集和顶点覆盖 3.5.6 最小费用流 3.5.7 应用问题 3.6 与平面和空间打交道的计算几何 3.6.1 计算几何基础 3.6.2 极限情况 3.6.3 平面扫描 3.6.4 凸包 ...