HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)
Farm Irrigation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11188 Accepted Submission(s): 4876
Problem Description
Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked from A to K, as Figure 1 shows.
Figure 1
Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map
ADC
FJK
IHE
then the water pipes are distributed like
Figure 2
Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn.
Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him?
Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.
Input
There are several test cases! In each test case, the first line contains 2 integers M and N, then M lines follow. In each of these lines, there are N characters, in the range of 'A' to 'K', denoting the type of water pipe over the corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.
Output
For each test case, output in one line the least number of wellsprings needed.
Sample Input
2 2
DK
HF 3 3
ADC
FJK
IHE -1 -1
Sample Output
2
3
Author
ZHENG, Lu
Source
Zhejiang University Local Contest 2005
分析:
1.dfs
对每个方块的四个方向搜索
搜过的标记一下
注意能往四个方向搜索的条件:方块的边界
#include<bits/stdc++.h>
using namespace std;
#define max_v 51
int t[11][4]= {1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1,
};
int vis[max_v][max_v];
int f[max_v][max_v];
int n,m;
void dfs(int i,int j)
{
vis[i][j]=1;
if(j>0&&t[f[i][j-1]][2]&&t[f[i][j]][0]&&vis[i][j-1]==0)//左
dfs(i,j-1);
if(i>0&&t[f[i][j]][1]&&t[f[i-1][j]][3]&&vis[i-1][j]==0)//上
dfs(i-1,j);
if(i<m-1&&t[f[i][j]][3]&&t[f[i+1][j]][1]&&vis[i+1][j]==0)//下
dfs(i+1,j);
if(j<n-1&&t[f[i][j]][2]&&t[f[i][j+1]][0]&&vis[i][j+1]==0)//右
dfs(i,j+1); }
int main()
{
char c;
while(~scanf("%d %d",&m,&n))
{
getchar();
if(n==-1&&m==-1)
break;
// memset(f,0,sizeof(f));
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
scanf("%c",&c);
f[i][j]=c-'A';//转换
}
getchar();
}
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(vis[i][j]==0)
{
sum++;
dfs(i,j);
}
}
}
printf("%d\n",sum);
}
return 0;
}
2.并查集
问你连通图的个数,并查集,但是要自己构造连通条件
连通条件:
对每个方块,看它的左边和上面的方块能否和它连通,能的话就合并
注意方块的边界,比如第0行,就只要看他左边的方块能不能和他合并,不用看上面,因为上面是空的
第0行第0列的方块 跳过
第0行的 只看他左边的
第0列的 只看他上面的
其他的 看左边和上面的
11个方块,一个方块的四条边有管子的就是1,比如A块,1,1,0,0
#include<bits/stdc++.h>
using namespace std;
#define max_v 51
int t[11][4]={1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1,
};
int sum;
int pa[max_v*max_v];//数组大小需要注意,坑了很多次
int rk[max_v*max_v];
void make_set(int x)
{
pa[x]=x;
rk[x]=0;
}
int find_set(int x)
{
if(x!=pa[x])
pa[x]=find_set(pa[x]);
return pa[x];
}
void union_set(int x,int y)
{
x=find_set(x);
y=find_set(y);
if(x==y)
return ;
sum--;
if(rk[x]>rk[y])
{
pa[y]=x;
}else
{
pa[x]=y;
if(rk[x]==rk[y])
rk[y]++;
}
}
int main()
{
int n,m;
int f[max_v][max_v];
char c;
while(~scanf("%d %d",&m,&n))
{
getchar();
if(n==-1&&m==-1)
break;
// memset(f,0,sizeof(f));
sum=n*m;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&c);
f[i][j]=c-'A';//转换
make_set(i*n+j);//初始化
if(i==0&&j==0)
continue;
else if(i==0)
{
if(t[f[i][j-1]][2]&&t[f[i][j]][0])//第0行,判断左
union_set(i*n+j,i*n+j-1);
}
else if(j==0)//第0列,判断上
{
if(t[f[i][j]][1]&&t[f[i-1][j]][3])
union_set(i*n+j,(i-1)*n+j);
}else
{
// 其他 判断左和上
if(t[f[i][j-1]][2]&&t[f[i][j]][0])
union_set(i*n+j,i*n+j-1);
if(t[f[i][j]][1]&&t[f[i-1][j]][3])
union_set(i*n+j,(i-1)*n+j);
}
}
getchar();
}
printf("%d\n",sum);
}
return 0;
}
HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)的更多相关文章
- 杭电OJ——1198 Farm Irrigation (并查集)
畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可 ...
- hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...
- hdu 1198 Farm Irrigation(并查集)
题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- HDU 1198 Farm Irrigation(并查集+位运算)
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
- HDU 1198 Farm Irrigation(状态压缩+DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu1198 Farm Irrigation 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 简单并查集 分别合并竖直方向和水平方向即可 代码: #include<iostream&g ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1198 Farm Irrigation
令人蛋疼的并查集…… 我居然做了大量的枚举,居然过了,我越来越佩服自己了 这个题有些像一个叫做“水管工”的游戏.给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
随机推荐
- BZOJ5068: 友好的生物(状压 贪心)
题意 题目链接 Sol 又是一道神仙题??.. 把绝对值拆开之后状压前面的符号?.. 下界显然,但是上界为啥是对的呀qwq.. #include<bits/stdc++.h> using ...
- Myeclipse下集成SVN插件
一.下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 在 ...
- PHP学习笔记(一) ---- PHP简介以及基本语法
PHP 一.PHP 简介 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点, 利于 ...
- AngularJS开发人员最常犯的10个错误
简介AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app原型,但AngularJS对于全功能的客户 ...
- Java基础之引用(String,char[],Integer)总结于牛客网的专项练习题
1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer ...
- MySQL数据库(13)----忘记root用户密码解决方案【转载】
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...
- Activity 四种launchMode
launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的 Activity实例,是否和其他Activity实例公用一个tas ...
- 关于Spring MVC中的表单标签库的使用
普通的MVC设计模式中M代表模型层,V代表视图层,C代表控制器,SpringMVC是一个典型的MVC设置模式的框架,对于视图和控制器的优化很多,其中就有与控制器相结合的JSP的表单标签库. 我们先简单 ...
- 初识WCF3
http://www.cnblogs.com/xiangchangdong/p/3924030.html 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包 ...
- MySQL 8.0.2复制新特性(翻译)
译者:知数堂星耀队 MySQL 8.0.2复制新特性 MySQL 8 正在变得原来越好,而且这也在我们MySQL复制研发团队引起了一阵热潮.我们一直致力于全面提升MySQL复制,通过引入新的和一些有趣 ...