`
人生难得糊涂
  • 浏览: 117386 次
社区版块
存档分类
最新评论

POJ2446-二分图的最大独立数

 
阅读更多

一张残缺的棋盘,用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;
}

 

0
0
分享到:
评论

相关推荐

    ACM讲课之二分图匹配匈牙利算法学习教案.pptx

    匈牙利算法是解决无权二分图最大匹配问题的经典算法之一。该算法的核心思想是通过不断寻找所谓的“增广路径”来逐步扩大匹配集M的大小,直到无法再找到增广路径为止。 **关键概念:** - **盖点**:指那些被当前匹配...

    poj图论题目汇总

    #### 1466 Girls and Boys - 二分图 (最大独立团) - **知识点**:最大独立团问题,在二分图中寻找最大的不相邻顶点集合。 #### 1469 COURSES - 二分匹配 - **知识点**:二分匹配算法。 #### 1502 MPI Maelstrom ...

    POJ题目分类

    - **内容**: 解决二分图最大匹配问题的算法。 - **示例题目**: poj1459, poj3436 - **知识点**: - **匈牙利算法**:一种高效的匹配算法,可以在多项式时间内找到一个二分图的最大匹配。 ### 三、数据结构 #### 1....

    POJ中级图算法所有题目【解题报告+AC代码】

    5. **二分图匹配**:匈牙利算法或Kuhn-Munkres算法用于求解二分图的最大匹配问题,广泛应用于配对问题。 6. **网络流**:包括Ford-Fulkerson算法和Edmonds-Karp算法,它们用于寻找网络中最大流量,可以解决很多实际...

    匈牙利算法模板以及应用

    匈牙利算法是一种解决二分图最大匹配问题的有效算法。二分图(Bipartite Graph)是指一个图中的节点可以分为两个互不相交的集合,使得每条边都连接这两个集合中的一个节点与另一个节点。匈牙利算法主要应用于寻找...

    ACM北大训练

    - **定义**: 在二分图中寻找最大匹配,即两个不相交顶点集中的最大数量的边的集合。 - **应用场景**: 常见于资源分配、任务分配等问题。 - **示例题目**: - poj3041: 涉及到二分图匹配问题,适合用匈牙利算法解决。...

    常用算法 (2).pdf

    1. **二分图匹配**:匈牙利算法解决二分图的完美匹配问题。 2. **最小路径覆盖**:寻找图中最小的边集合,使得所有顶点至少包含一条路径。 3. **网络流**:最大流量问题,如最大流最小割定理。 4. **最小费用流**:...

    算法之路 ,成功掌握各种算法

    - **二分图匹配**(匈牙利算法):解决二分图中最大匹配问题。 - **网络流**:解决最大流最小割问题,包括最小费用流。 - **线段树**:支持区间查询和更新操作的高效数据结构。 - **并查集**:用于维护一系列不相交...

    -ACM培训资料

    1. **二分图匹配**:使用匈牙利算法解决二分图的完美匹配问题。 2. **最小路径覆盖**:寻找覆盖所有顶点的最小路径集合。 3. **网络流**:用于解决流量分配问题,包括最小费用流。 4. **线段树**:一种数据结构,...

    常用计算机算法列表.pdf

    在第二阶段,我们遇到更复杂的算法,如二分图匹配(匈牙利算法)、最小路径覆盖和网络流问题。网络流问题包括最大流和最小费用流,它们在资源分配和调度等领域有广泛应用。动态规划是解决许多问题的强大工具,例如...

    挑战程序设计竞赛(第2版)

    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 凸包 ...

Global site tag (gtag.js) - Google Analytics