给你一个管道地图,求联通块个数

很简单的并查集,简单预处理输入一下

但zoj能过,hdu就是莫名其妙的wa

后来发现是我地图的表示时边界的处理有问题

例如

ABD

KJH

KNG

我把这个矩阵读取成一行:ABDKJHKNG

对于第i个元素 上下左右就表示为 ut=i - n ,lt=i -1 ,rt=i+1 ,dt=i+n;

判断边界:  ut>0   i%n !=1   i%n !=0  dt<=m*n

这样平常没什么问题,所以zoj能过

但是。。。 当矩阵宽度为1时,左右边界就会合并,这时判断 左边界 i%n !=1 就会出错,因为此时“余1” 就是 余0

所以要特判一下1.。。。

以后这种情况要特别注意(不过再碰到题我可能就不这样表示上下左右了)

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>using namespace std;int pre[500000];
int node[500000];
const int u[50 ]={1,1,0,0,1,0,1,1,0,1,1};
const int l [50 ]={1,0,1,0,0,1,1,1,1,0,1};
const int r [50 ]={0,1,0,1,0,1,1,0,1,1,1};
const int d[50 ]={0,0,1,1,1,0,0,1,1,1,1};void init( int n){for( int i=0 ;i<=n;i++)pre[i] = i;
}int find( int x){int r= x;while( pre[x] != x){x= pre[x];}int t;while( r!=x){t = pre[r];pre[r] = x;r = t;}return x;
}void add( int a ,int b){// cout<<a <<' '<<b<<endl;int x=find(a);int y=find(b);if( x!=y) pre[x] =y;return ;
}int main( ){int m ,n;while( cin>>m>>n){if( m<0 || n<0) break;int an = m*n;init( an);string op;int cnt = 1;for( int i=1 ;i<=m ;i++){cin>> op;for( int j=0 ; j<n ;j++)node[cnt++] =(int)(op[j]-'A');}for( int i=1 ;i<=an ;i++){int t=node[i];int ut=i - n ,lt=i -1 ,rt=i+1 ,dt=i+n;if( u[ t] && ut>0 && d[ node[ut] ])add(i ,ut);if( l[ t] && i%n !=1 && n !=1 && r[ node[lt] ])add(i ,lt); //就是这一行if( r[ t] && i%n !=0  && n !=1&& l[ node[rt] ])add(i ,rt);if( d[ t] && dt<=an && u[ node[dt] ])add(i ,dt);}int ans=0;for( int i=1 ; i<=an ;i++){if( pre[i] == i)ans++;//  cout<<i<<' '<<pre[i]<<endl;
         }printf("%d\n" ,ans);}return 0;
}

转载于:https://www.cnblogs.com/-ifrush/p/10660433.html

L - Farm Irrigation (并查集相关推荐

  1. hdu1198 Farm Irrigation —— dfs or 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 dfs: 1 #include<cstdio>//hdu1198 dfs 2 #in ...

  2. 一道并查集的(坑)题:关闭农场closing the farm

    题目描述 in English: Farmer John and his cows are planning to leave town for a long vacation, and so FJ ...

  3. [L氏并查集] Python 列表法实现非递归并查集,轻松权重优化。

    一般的并查集都是用递归或者新建一个类来实现,这里介绍一种用Python来实现的非递归非函数并查集,这个方法暂时未在其他地方见过,尤其是中文领域目前还未见过,很可能是搜索引擎无法搜索到正确内容的原因,所 ...

  4. 并查集入门+初级专题训练

    介绍   摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明:   并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...

  5. 【转】并查集MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...

  6. POJ1984 Navigation Nightmare —— 种类并查集

    题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K T ...

  7. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  8. 并查集训练题解(F-J)

    训练链接:http://acm.njupt.edu.cn/vjudge/contest/view.action?cid=173#overview F题 Navigation Nightmare Tim ...

  9. 并查集小结 (参考birdfly+修改)

    并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系. 并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个 ...

  10. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

最新文章

  1. uniapp 分享缩略图过大怎么办_女性胸外扩怎么办|3步带你完成改变
  2. 单片机编程简单吗?arduino为什么不适合大学生?
  3. 《iOS 9应用开发入门经典(第7版)》——第1章,第1.6节小结
  4. CocoaPods 的使用与一些异常情况的处理
  5. 汇编基础知识之输入输出
  6. 五分钟带你摸透 Vue组件及组件通讯
  7. rust加载不进去服务器eac_基于腾讯云的 Rust 和 WebAssembly 函数即服务
  8. java数组与C++数组间的区别
  9. python编程考试_《Python程序设计》试题库
  10. JavaScript RegExp(正则)
  11. 高级工计算机操作试题及答案,计算机系统操作高级工试题和答案[1]
  12. NUC1429 WERTYU【输入输出+水题】
  13. java提取省市县乡镇村
  14. 在商业化道路上,小冰还要再多走几步
  15. java 只保留字母_java编程问题,急急急!输入一个字符串,如果字符串中存在字母a的次数大于1,则只保留第一个a,...
  16. 计算机考试a bcd哪一级难,2014计算机一级考试试题:WPS及基础题
  17. 北京十大著名拆迁律师事务所(精品拆迁律师)
  18. camera 自动对焦手动对焦
  19. Enhancement
  20. python开源oa系统_最全总结 | 聊聊 Python 办公自动化之 Word(下)

热门文章

  1. 前后端分离项目如何部署_不用Docker前后端分离项目如何快速部署
  2. 约束最优化方法 (一) 最优性条件
  3. ubuntu16.04下ROS操作系统学习笔记(七 )机器语音-语音听写-科大讯飞SDK调用
  4. ubuntu16.04中ROS-Kinetic安装Arbotix
  5. 键盘各键对应的ASCII码值(包括鼠标和键盘所有的键)
  6. Hive metastore整体代码分析及详解
  7. Android获取前台进程的方法
  8. 把 Reative Native 47 版本集成到已有的 Native iOS 工程中
  9. Bzoj 2154: Crash的数字表格(积性函数)
  10. spring集成mybatis后怎么在控制台打印sql语句