题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198

dfs:

 #include<cstdio>//hdu1198 dfs
#include<cstring> int well[][] = { {,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,},{,,,,}}; const int ca[][] = {,,,,,,,,,}, mov[][] = {,,-,,,,,-};
int m,n,sum, map[][],id[][]; void build(int set, int x, int y)
{
for(int k = ; k<; k++)
{
if(well[set][k])
{
map[*x+ca[k][]][*y+ca[k][]] = ;
}
}
} void dfs(int x, int y, int iden)
{
id[x][y] = iden;
for(int i = ; i<; i++)
{
int xx = x + mov[i][], yy = y + mov[i][];
if(xx< || xx>*m- || yy< || yy>*n- ) continue;
if(map[xx][yy] && !id[xx][yy])
dfs(xx,yy,iden);
}
} int main()
{
char init[];
while(scanf("%d%d",&m,&n) && (m!=- || n!=- ))
{
memset(map,,sizeof(map));
memset(id,,sizeof(id));
for(int i = ; i<m; i++)
{
scanf("%s",init);
for(int j = ; j<n; j++)
build(init[j]-,i,j);
}
sum = ;
for(int i = ; i<=*m-; i++)
{ for(int j = ; j<=*n-; j++)
{
//printf("%d ",map[i][j]);
if(map[i][j] && !id[i][j])
{
dfs(i,j,++sum);
}
}
//putchar('\n');
} printf("%d\n",sum); }
return ;
}

并查集:

 #include<cstdio>//hdu1198 并查集 每个格子的标号为i*n+j,初始father也为i*n+j,以次来作为合并集合的依据
#include<cstring> int n,m,father[][];
char map[][];
char type[][]={"","","","","","",
"","","","",""}; int find(int x)
{
return (x==father[x/n][x%n])?x:find(father[x/n][x%n]);
} int unit(int a, int b)
{
a = find(a);
b = find(b);
if(a!=b)//合并集合
father[a/n][a%n] = b;
} int judge(int i, int j)
{ //判断是否与左边相连
if(j> && type[map[i][j]-'A'][]=='' && type[map[i][j-]-'A'][]=='')
unit(i*n+j,i*n+j-);
//判断是否与上边相连
if(i> && type[map[i][j]-'A'][]=='' && type[map[i-][j]-'A'][]=='')
unit(i*n+j,(i-)*n+j);
} int main()
{
while(scanf("%d%d",&m,&n) && (m!=- || n!=-))
{
for(int i = ; i<m; i++)
{
scanf("%s",&map[i]);
for(int j = ; j<n; j++)
{ //初始化为自己
father[i][j] = i*n+j;
}
} //并查集过程
for(int i = ; i<m; i++)
for(int j = ; j<n; j++)
judge(i,j); int sum = ;
for(int i = ; i<m; i++)
for(int j = ; j<n; j++)//看看有多少个“根节点”
if(father[i][j]==i*n+j) sum++; printf("%d\n",sum);
} }

hdu1198 Farm Irrigation —— dfs or 并查集的更多相关文章

  1. hdu1198 Farm Irrigation 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 简单并查集 分别合并竖直方向和水平方向即可 代码: #include<iostream&g ...

  2. hdu.1198.Farm Irrigation(dfs +放大建图)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. acdream 1685 多民族王国(DFS,并查集)

    Problem Description 娜娜好不容易才回忆起自己是娜娜而不是什么Alice,也回忆起了自己要继续探索这个世界的目标,便偷偷溜出皇宫.娜娜发现这个王国有很多个民族组成,每个民族都有自己的 ...

  4. HDU 5438 Ponds (DFS,并查集)

    题意:给定一个图,然后让你把边数为1的结点删除,然后求连通块结点数为奇的权值和. 析:这个题要注意,如果删除一些结点后,又形成了新的边数为1的结点,也应该要删除,这是坑,其他的,先用并查集判一下环,然 ...

  5. 判图的连通性(dfs,并查集)

    一.无向图 欧拉回路:每个顶点度数都是偶数 欧拉路:所有点度数为偶数,或者只有2个点度数为奇数 当然判连通性 hdu 1878 欧拉回路 两种判连通的方法 dfs #include <iostr ...

  6. ZOJ 2412 Farm Irrigation(DFS 条件通讯块)

    意甲冠军  两个农田管内可直接连接到壳体  他们将能够共享一个水源   有11种农田  管道的位置高于一定  一个农田矩阵  问至少须要多少水源 DFS的连通块问题  两个相邻农田的管道能够直接连接的 ...

  7. 蓝桥杯历届试题 危险系数(dfs或者并查集求无向图关于两点的割点个数)

    Description 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我们来定义一个 ...

  8. Codeforces Round #375 (Div. 2) D. Lakes in Berland (DFS或并查集)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)

    http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时 ...

随机推荐

  1. netframework中等待多个子线程执行完毕并计算执行时间

    本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...

  2. 洛谷——P2706 巧克力

    P2706 巧克力 题目背景 王7的生日到了,他的弟弟准备送他巧克力. 题目描述 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒 ...

  3. UVA - 10615 Rooks

    建一下模,把行和列看成二分图的点,把车看成是二分图中的边,这样就变成了上一个博客的问题. 我们每次新加一条边,就把它加入一条 这条边两端点最小没有出现的颜色  交替出现的路径中去. #include& ...

  4. linux删除空行操作:awk、grep、tr、sed

    如下:如何删除空行 shen\nshen\\n sen seh sehe she she 真正删除空行,可以使用vim: 通过命令模式删除空行.vim在命令模式下(在vim里输入英文字符:进入命令模式 ...

  5. Direct2D教程(二)来看D2D世界中的Hello,World

    引子 任何一门语言的第一个教程几乎都是Hello,world.我们也不例外,但是这里不是教大家打印Hello,world,而是编写一个简单的D2D绘制程序,让大家对Direct2D的程序结构及编程方法 ...

  6. lua——基础语法

    -- test lua: for learning lua grammar -- line comment --[[ block comment ]]-- -- print hello world p ...

  7. python_获得列表中重复的项的索引

    a = ['b','a', 'b', 'c', 'a', 'c','d'] b=[] f=[] for i in a: c=[] for item in enumerate(a): if item[1 ...

  8. 梦入IBM之java基础-网络编程

    如今我们来谈谈最后的内容:网络编程: 1):TCP中是线程与线程进行通讯!内部的执行机制是这种:先有一个线程去监听某个port.然后假设有Socket连接上来了以后,server会生成一个Socket ...

  9. Java序列化算法

    Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.java序列化API提供一种处理对象序列化的标准机 ...

  10. vs附加到多个进程调试

    我们用vs调试,通常附加到一个进程进行调试,有时候需要同时附加到多个进程. 例如:同时调试客户端与服务端,我们需要同时附加到客户端与服务端进程. 按F5(执行)键调试,程序只要遇到断点就中断. 按F1 ...