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种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
随机推荐
- hadoop classpath 的作用
HADOOP_CLASSPATH 是设置要运行的类的路径.否则当你用hadoop classname [args]方式运行程序时会报错,说找不到要运行的类.用hadoop jar jar_name.j ...
- IDEA 2017.2.2 环境下使用JUnit
JUnit:单元测试框架,测试对象为一个类中的方法. JUnit不是Javase的一部分,想要使用需要导入jar包,在IntelliJ IDEA 中自带JUnit插件. JUnit 版本有3.X 4. ...
- Jquery把获取到的input值转换成json
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 移动端HTML5实现文件上传
PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现. 用的技术 ...
- 一类划分关系和指数级生成函数,多项式exp的关系
划分关系 姑且这么叫着 设满足性质 \(A\) 的集合为 \(S_A\),每个元素有标号 如果 \(S_B\) 是由若干个 \(S_A\) 组成的一个大集合 设 \(a_i\) 表示大小为 \(i\) ...
- php 生成唯一id的几种解决方法(实例)
php 生成唯一id,网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid ...
- The String class's judging function
字符串的判断功能: package com.itheima_03; /* * Object:是类层次结构中的根类,所有的类都直接或者间接的继承自该类. * 如果一个方法的形式参数是Object,那么这 ...
- 毕向东_Java基础视频教程第20天_IO流(15~17)
第20天-15-IO流(打印输出流) 打印输出流:PrintWriter与PrintStream 两者的区别:Since JDK 1.4 it's possible to specify the ch ...
- C#中IL, CTS, CLR, CLS, JIT含义
1. IL/MSIL (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言) 2. CTS (Common Type System ...
- Nginx学习---企业级nginx环境搭建
1.1. nginx安装环境 1.系统要求 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. 1-1 安装 GCC 源码安装nginx需要依赖gcc环境,需要 ...