hdu 5556 Land of Farms

微软登录OAuth 2.0授权流程 OAuth 2.0是一个关于授权的开放网络标准,它允许第三方应用获取用户数据,是目前最流行的授权机制。微软身份平台支持OAuth 2.0授权码流程,使得客户端应用程序能够获得对受保护资源(如网络API)的授权访问。这一流程在保障用户数据安全的前提下,实现了应用的便捷登录与数据共享。当用户在一个支持OAuth 2.0的应用上,希望使用微软账号进行登录时,OAuth 2.0授权流程即被触发。 阅读详情


Land of Farms

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 675    Accepted Submission(s): 220


Problem Description
Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of  N×M grids. A farm consists of one or more connected grids. Two grids are adjacent if they share a common border, i.e. their Manhattan distance is exactly 1. In a farm, two grids are considered connected if there exist a series of adjacent grids, which also belong to that farm, between them.

Farmer John wants to build as many farms as possible on the new land. It is required that any two farms should not be adjacent. Otherwise, sheep from different farms would fight on the border. This should be an easy task until several ancient farms are discovered.

Each of the ancient farms also consists of one or more connected grids. Due to the respect to the ancient farmers, Farmer John do not want to divide any ancient farm. If a grid from an ancient farm is selected in a new farm, other grids from the ancient farm should also be selected in the new farm. Note that the ancient farms may be adjacent, because ancient sheep do not fight each other.

The problem is a little complicated now. Can you help Farmer John to find a plan with the maximum number of farms?
 

Input
The first line of input contains a number  T  indicating the number of test cases ( T≤200 ).

Each test case starts with a line containing two integers  N  and  M , indicating the size of the land. Each of the following  N  lines contains  M  characters, describing the map of the land ( 1≤N,M≤10 ). A grid of an ancient farm is indicated by a single digit (0-9). Grids with the same digit belong to the same ancient farm. Other grids are denoted with a single character “ .”. It is guaranteed that all test cases are valid.
 

Output
For each test case, output a single line consisting of “ Case #X: Y”.  X  is the test case number starting from 1.  Y  is the maximum number of new farms.
 

Sample Input
  
3 3 4 ..3. 023. .211 2 3 ... ... 4 4 1111 1..1 1991 1111
 

Sample Output
  
Case #1: 4 Case #2: 3 Case #3: 1
 

Source
 

Recommend
wange2014   |   We have carefully selected several similar problems for you:   6032  6031  6030  6029  6028 
 
题意: 一个N*M的矩阵,其中“.”代表空地,“0-9”代表古代建筑,相邻的相同古代建筑要么不建要么同时建,即可以看成一个点,每个空地也是一个点,然后相邻的两个点不能同时建,问最多能建几个点。

思路:当时我还没做过最大团问题。我先把联通块缩点然后把非相邻的两个点建边,然后就想不到怎么搞了。我只知道我这建的图的的最大完全子图是答案,但是不会求。之后找了题解就看到了最大团这个概念。最大团就是最大完全子图。然后我把模板套上去就好了。。。。。这里还有个定理:最大独立集合=补图的最大团=节点数-最大匹配数。下面给代码:

#include<bits/stdc++.h> 
using namespace std;
typedef long long LL;
const int maxn=15;
char s[maxn][maxn];
int n,m,vis[maxn][maxn],steparr[4][2]={-1,0,1,0,0,1,0,-1},vis2[maxn*maxn][maxn*maxn],num;
const int N=105;
bool G[N][N];
int Max[N],Alt[N][N],ans;
void dfsblock(int x,int y,char mark){
	if(x<0||x>=n||y<0||y>=m||vis[x][y]||s[x][y]!=mark)
		return;
	vis[x][y]=num;
	for(int i=0;i<4;i++){
		int nextx=x+steparr[i][0];
		int nexty=y+steparr[i][1];
		dfsblock(nextx,nexty,mark);
	}
}
void dfsedge(int x,int y){
	if(x<0||x>=n||y<0||y>=m||vis2[x][y])
		return;
	vis2[x][y]=1;
	for(int i=0;i<4;i++){
		int nextx=x+steparr[i][0];
		int nexty=y+steparr[i][1];
		G[vis[x][y]][vis[nextx][nexty]]=1;
		dfsedge(nextx,nexty);
	}
}

bool DFS(int cur,int tot){
    if(!cur){
        if(tot>ans){ans=tot;return 1;}
        return 0;
    }
    for(int i=1;i<=cur;i++){
        if(cur-i+tot+1<=ans)return 0;
        int u=Alt[tot][i],nxt=0;
        if(Max[u]+tot<=ans)return 0;
        for(int j=i+1;j<=cur;j++)
            if(G[u][Alt[tot][j]])Alt[tot+1][++nxt]=Alt[tot][j];
        if(DFS(nxt,tot+1))return 1;
    }
        return 0;
    }
int MaxClique(){
    ans=0,memset(Max,0,sizeof(Max));
    for(int i=num-1;i;i--){
        int cur=0;
        for(int j=i+1;j<num;j++)
            if(G[i][j])Alt[1][++cur]=j;
        DFS(cur,1);
        Max[i]=ans;
    }
    return ans;
}
int main(){
	int t;
	scanf("%d",&t);
	for(int tcase=1;tcase<=t;tcase++){
		memset(vis,0,sizeof(vis));
		memset(G,0,sizeof(G));
		memset(vis2,0,sizeof(vis2));
		ans=0;
		num=1;
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			scanf("%s",s[i]);
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(vis[i][j])
					continue;
				if(s[i][j]=='.')
					vis[i][j]=num++;
				else{
					dfsblock(i,j,s[i][j]);
					num++;
				}
			}
		}	
		dfsedge(0,0);
		for(int i=1;i<num;i++){
			for(int j=1;j<num;j++){
				G[i][j]=!G[i][j];
			}
		}
		MaxClique();
		printf("Case #%d: %d\n",tcase,ans);
	}
}


#include<bits/stdc++.h>
using namespace std;
#define N 102  
int mx;//最大团数(要初始化为0)  
int x[N],tuan[N];  
int can[N][N];//can[i]表示在已经确定了经选定的i个点必须在最大团内的前提下还有可能被加进最大团的结点集合  
int num[N];//num[i]表示由结点i到结点n构成的最大团的结点数  
bool g[N][N];//邻接矩阵(从1开始)  
int n,m;  
bool dfs(int tot,int cnt)
{  
    int i,j,k;  
    if(tot == 0)
	{  
        if(cnt > mx)
		{  
            mx = cnt;  
            for(i=0;i<mx;i++)
			{  
                tuan[i] = x[i];  
            }  
            return true;  
        }  
        return false;  
    }  
    for(i=0;i<tot;i++)
	{  
        if(cnt + (tot-i) <= mx)return false;  
        if(cnt + num[can[cnt][i]] <= mx)return false;  
        k = 0;  
        x[cnt] = can[cnt][i];  
        for(j=i+1;j<tot;j++)
		{  
            if(g[can[cnt][i]][can[cnt][j]])
			{  
                can[cnt+1][k++] = can[cnt][j];  
            }  
        }  
        if(dfs(k,cnt+1))return false;  
    }  
    return false;  
}  
void MaxTuan()
{  
    int i,j,k;  
    mx = 1;  
    for(i=n;i>=1;i--)
	{  
        k = 0;  
        x[0] = i;  
        for(j=i+1;j<=n;j++)
		{  
            if(g[i][j])
			{  
                can[1][k++] = j;  
            }  
        }  
        dfs(k,1);  
        num[i] = mx;  
    }  
}  
const int maxn=20;
struct Node
{
	int x,y;
	Node(int _x=0,int _y=0):x(_x),y(_y){}
};
int id,dir[4][2]={-1,0,1,0,0,-1,0,1},ID[maxn][maxn];
char mp[maxn][maxn];
bool over(int x,int y)
{
	if(x<1||x>n||y<1||y>m)	return true;
	return false;
}
void getid(int x,int y)
{
	if(ID[x][y]) return;
	if(mp[x][y]=='.') { ID[x][y]=id++; return; }
	else ID[x][y]=id++;
	queue<Node>	Q;
	Q.push(Node(x,y));
	while(!Q.empty())
	{
		Node head=Q.front();
		Q.pop();
		for(int i=0;i<4;i++)
		{
			int tx=head.x+dir[i][0],ty=head.y+dir[i][1];
			if(over(tx,ty)||ID[tx][ty]||mp[tx][ty]-mp[x][y]) continue;
			ID[tx][ty]=ID[x][y];
			Q.push(Node(tx,ty));
		}
	}
}
void init()
{
	memset(ID,0,sizeof(ID));
	memset(g,0,sizeof(g)); 
	id=1; 
	mx=0;
}
int main()
{  
    int T,cas=1;
    scanf("%d",&T);
	while(T--)
	{  
		init();
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) scanf("%s",mp[i]+1);
		for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) getid(i,j);
        for(int i=1;i<=n;i++)
        {
			for(int j=1;j<=m;j++)
			{
				for(int k=0;k<4;k++)
				{
					int x=i,y=j;
					int tx=x+dir[k][0],ty=y+dir[k][1];
					if(over(tx,ty)) continue;
					if(ID[x][y]!=ID[tx][ty]) g[ID[x][y]][ID[tx][ty]]=g[ID[tx][ty]][ID[x][y]]=true;
				}
			}
		}
		n=id-1;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=!g[i][j];
        MaxTuan();  
        printf("Case #%d: %d\n",cas++,mx);  
    }  
    return 0;  
}   



Visual Studio 2022 社区版安装指南:从下载到配置的完整流程 本文详细介绍了Visual Studio 2022社区版的完整安装与配置流程,包括系统要求检查、官方下载步骤、工作负载选择、安装位置配置等关键环节。作为微软推出的免费集成开发环境,VS2022社区版支持多种编程语言,适合个人开发者和小型团队使用。文章还提供了常见问题解决和性能优化技巧,帮助用户高效完成开发环境搭建。 阅读详情

相关推荐

android mtk camera如何自定义默认拍照与录像分辨率

本文详细解析了在Android MTK平台上自定义相机默认拍照与录像分辨率的方法。通过分析Camera2应用默认选择逻辑,定位并修改PictureSize.java与VideoQualityCaptureRequestConfig.java中的关键代码,实现绕过系统智能选择,强制指定最高或特定分辨率。文章还提供了进阶的可配置化方案与验证避坑指南,帮助开发者精准控制相机行为。

weixin_29194817的博客 431

HDU-5556 Land of Farms(无向图的最大独立集)

2015ACM/ICPC亚洲区合肥站 Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of N×MN×M grids. A farm consists of one or more connected grids. Two grids are adjace

yo_bc的博客 709

ali140滑块

ali 140滑块采用补环境的方式进行逆向,需要的文件主要为这两个,其中collina.js是最主要的环境校验和参数加密的逻辑,这两个文件放本地进行补环境。然后挂上代理,先保证能够正常运行代码,补了些许后能够正常运行了,我们打印最主要的加密函数看看:n值就是得到:挂上代理看看鼠标事件,不管加密逻辑,关心入参即可:收集一些鼠标事件传进记录的函数。其余就是处理一些环境值,一些resetSA的逻辑就行。截图记录:

bboysteed的博客 1676

HDU 5556 Land of Farms 最大团

一个N*M的矩阵,一个农场会覆盖一片连通的区域,新农场与其他农场不可相邻,新农场可以建在空地上,也可以完全地占据一个旧农场,旧农场(不超过10个)已给定,问最多能安排多少个农场?考虑将将旧农场的所有格子缩成1点,空地保持1格1点,那么问题就变成求图的最大独立点集,求补图的最大团即可。#include <cstdio> #include <cstring> using namespace std; #

とある黄鱼のOIブログ 1051

非华为电脑与MatePad Pro多屏协同实战:从安装管家到攻克连接难题

本文详细介绍了在非华为电脑上安装华为电脑管家并实现与MatePad Pro多屏协同的完整指南。从安装步骤、常见连接失败解决方案到华为账号绑定技巧,提供了实用的操作方法和硬件优化建议,帮助用户攻克连接难题,提升多屏协同的稳定性和流畅度。

weixin_30263073的博客 233

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5805

hdu 5556 Land of Farms【思维+暴力枚举+最大独立集】好题!

Land of Farms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 526    Accepted Submission(s): 174 Problem Description Farmer John and hi

mengxiang000000 1259

智能手环心率检测不准?用STM32+MAX30102教你实现医疗级精度(含算法优化)

本文详细解析了如何利用STM32微控制器和MAX30102光学传感器实现医疗级精度的心率检测方案。通过硬件参数调校、ADC采集优化、运动伪影消除及深度学习算法改进,显著提升智能手环在静态和运动状态下的检测精度,误差可控制在±1.5bpm以内,满足医疗电子标准。

weixin_28335283的博客 525

HDU5556:Land of Farms(图的最大独立集 & 最大团)

Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of N×MN×Mgrids. A farm consists of one or more

junior19的博客 645

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

Spring Boot 微服务 API 网关实战:Spring Cloud Gateway 整合,搞定路由转发 + 统一认证 + 限流熔断(企业级落地)

摘要:本文详细介绍了SpringCloud Gateway在微服务架构中的核心作用与实现方案。作为API网关,它解决了服务入口分散、认证冗余、流量失控等痛点,提供路由转发、统一认证、限流熔断等能力。文章通过图书管理系统案例,演示了SpringBoot整合Gateway的全流程,包括基础路由配置、JWT全局认证、局部参数校验、Sentinel限流熔断以及Nacos动态路由等核心功能实现。特别强调了企业级落地中的关键注意事项,如路由顺序、过滤器执行顺序、HTTPS配置等。该方案能有效构建统一、安全、高效的微服务

lamehsl的专栏 1381

HDU 5556 Land of Farms 【最大独立点集】

题目链接 题意:N*M的图中有一些旧农场,现在要建立一些新的农场,如果新的农场覆盖了某一个旧的农场中的一个点,它就必须覆盖整个这个旧农场。现在要建立尽可能多的新农场,使得每个新农场之间都不相邻,求最多能建立多少个新农场。 很容易想到最大独立点集这东西,把每个旧农场看成一个点,不是农场的点看成一个点,在相邻的之间建边,求最大独立点集即可。 最大独立点集=补图的最大独立团,因此求出补图的最大独立...

hxh的博客 381

【目标检测】基于yolov5的铝型材表面缺陷检测(附代码和数据集,Ubuntu或者Linux系统均可运行)

【目标检测】基于yolov5的铝型材表面缺陷检测(附代码和数据集,Ubuntu或者Linux系统均可运行)

学无止境、积少成多、厚积薄发 2170

hdu5556 Land of Farms

我对于题目的一种理解 改造农场 1.建新农场 在空的点选 2.重建旧农场 选一个点属于这个农场的地方都要选 最后的农场都不能相连 所以枚举旧农场的个数并进行二分图匹配 #include<bits/stdc++.h> using namespace std; int N,M; char mp[12][12]; vector<pair...

diankeng5481的博客 199

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

hdu 5556 Land of Farms(二分图匹配)

题目链接:hdu 5556 Land of Farms解题思路枚举哪些位置是重建的,重建的周围位置不能用,其他空地用做二分图匹配最大独立集。代码#include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <algorithm>using namespace std; typedef pair<i

不慌不忙、不急不躁 1829

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU5556 Land of Farms 最大独立集

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5556 思路:直接枚举祖先的选不选,然后把选上的附近的删掉,然后剩下的点按做最大独立集. 祖先那边选了x个,剩下的没被删掉的点共n个,把x+y是奇数的放一边,偶数的放另一边,匹配数是m,那么结果就是x+n-m。 代码: #include #include #include #inclu

HandsomeHow的博客 555

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

『HDU 5556』Land of Farms

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5556 转载链接:http://blog.youkuaiyun.com/mengxiang000000/article/details/52712864题意:(题意特别难理解)有个农夫,想在发现的新大陆中开荒养羊, ‘.’代表没开荒的地, ‘数字’代表已经开荒过的旧农场. 农夫呢想做新农场尽可能多,而且新农场和新农

Gavinjou大笨象的博客 525

HDU 5556 Land of Farms(枚举 匈牙利)

题意:N*M的矩阵,'.'代表空地,'0-9'代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要 将该编号全部建筑建立起来,如果在空地上建筑,只建立当前点。问最多能够建立多少种建筑,并且每两种建筑之间 没有公共边。 思路:如果没有古代建筑,匈牙利就行,相邻的点建边,最后答案就是最大独立集=点数-匹配数(因为是双向边 所以/2). 这题有古代建筑,但是建筑数最多才1

CillyB的博客 462

hdu 5556 Land of Farms(最大独立集)

这题很明显可以用最大独立集来做,但是写代码很麻烦,是本人目前碰到的建图最麻烦的一道题

Kblacksmith的博客 975

HDU5556 Land of Farms(最大独立集)

题目大意: 一个N*M的矩阵,其中“.”代表空地,“0-9”代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如果在空地上建筑,只建立当前点。问最多能够建立多少种建筑,并且每两种建筑之间没有公共边。 题目意识比较难懂,我们来分析一下第一组样例: [cpp] view plain copy

Rain 721

HDU - 5556 Land of Farms 枚举 + 无向二分图最大独立集

题意:有一个农场大小为n*m  里面有一些古老的农田,你现在需要新建一些农田,要求新建的农田之间不能相连,古老的农田不可拆分,如果你选择了一块土地(原为古老的农田)建立新农田则该新农田需要把一整块连通的古老的农田全部包含。问最多能新建多少个农田。 思路:由于古老的农田只有10个,因此我们可以枚举选哪几个古老的农田,然后对于剩下的空地,相邻空地之间建边,求一个二分图的最大独立集就是剩下的空地中最多

WA是一笔财富 417

Land of Farms HDU - 5556最大独立集

题目大意: 分析: 首先,由于古老的东西数目比较少,可以枚举选择了哪些古老的东西,然后删除古老的东西和选择的古老的东西四周的点,对于剩下的点跑匈牙利匹配。 ans=选择的古老的种类+剩下的点-二分图匹配/2 #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; #include &lt;cstdi...

CURRYWANG97的博客 346

HDU5556 Land of Farms(二分图 2015 合肥区域赛)

容易想到将问题转化为求图的独立数问题 ,但求一般图的独立集是一个NPC问题,需要一些转化。 状态压缩,枚举每个上古农场是否选择,然后将剩下的新农场根据i + j奇偶性分为x , y集。 结果为 max(tot + nx + ny - 二分图匹配数) #include<cstdio> #include<iostream> #include...

Nobel7889的专栏 234

Land of Farms HDU - 5556 二分图匹配

Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists ofN×MN×Mgrids. A farm consists of one or more c...

weixin_30781775的博客 159

HDU 5556 Land of Farms(枚举+二分图匹配)

Land of FarmsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 526 Accepted Submission(s): 174 Problem Description Farmer John and his broth

yasolx的博客 535

hdu 5556 Land of Farms 最大团+暴力

Land of Farms Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 539Accepted Submission(s): 177 Problem Description Farmer John and his brot...

weixin_30779691的博客 186
上一篇: hdu 5514 Frogs
下一篇: 最大团模板
overload1997
博客等级 码龄11年 328粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值