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种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
随机推荐
- Win10系统安装vmware workstation 12后没有桥接网卡怎么办
原文 vmware workstation是一款虚拟机计算机软件,可以同时运行不同的操作系统,然而有win10系统用户在安装vmware workstation 12之后,却发现网络连接里面没有桥接网 ...
- MVC 中导出Execl 对 科学计数 的转化
相信大家在使用MVC 的做execl 数据导出的时候,遇到过 身份证号码 银行卡号 交易号 等一大串数字的时候,在导出execl 的时候就会出现 科学计数的输入:下面来说一下解决方案: 第一种:在MV ...
- asp.net WebService的一个简单示例
不同的系统之间经常会需要数据的交换对接,而Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范 ...
- "Error: ANDROID_HOME is not set and "android" command not in your PATH. You must fulfill at least one of these conditions.".
设置环境变量 set ANDROID_HOME=C:\\android-sdk-windows set PATH=%PATH%;%ANDROID_HOME%\tools;%ANDROID_HOME%\ ...
- BZOJ1996 [Hnoi2010] 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 令$f_{i,j}$ ...
- BZOJ1266 [AHOI2006]上学路线
Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...
- 理解webpack4.splitChunks之其余要点
splitChunks除了之前文章提到的规则外,还有一些要点或是叫疑惑因为没有找到官方文档的明确说明,所以是通过我自己测试总结出来的,只代表我自己的测试结果,不一定正确. splitChunks.ca ...
- Html5 填表 表单(二) input type 各种输入, 各种用户选择,上传等等泛输入用户交互
<input> 无限制输入 type 限制输入 type = 如下类型 type 后还可以跟一些属性: 如<input type=text max ...
- Socket for android 简单实例
最近在实现socket通信,所以写个demo来简单实现下.我用了一种是原始的socket实现,另一种是MINA框架来实现的. 下载demo:http://download.csdn.net/detai ...
- centos下运行python3.6+Django+mysql项目
文件准备: Django项目 myslq安装 关闭防火墙 用xshell拖拽到centos上 安装文件: 安装python3.6(3.7有问题) sh install_py36.sh 关闭防火墙 sh ...