hdu 1198 并查集应用
来源:互联网 发布:迅雷看看播放器mac版 编辑:程序博客网 时间:2024/04/28 02:13
其实可能是因为知道是用并查集做的原因啦,一下就看出题意了,明显是并查集思想,每次输入地图中的一块,检测这一块与它顶头的那块可不可以相通
如果可以合并集合;同理检测其与它左边的那一块;最后遍历一遍看有多少个根结点即要多少个水源
下面是代码,有点乱
#include<iostream>#include<vector>#define M 55#define N 55using namespace std;class elem{public:bool up;bool down;bool right;bool left;};class cor{public:int x;int y;};cor father[M][N];int n,m;void init(vector<elem>& farm){//初始化给出的11块地的样子保存下来,下标为0的不要elem x;x.up = false; x.down = false;x.right = false;x.left = false;farm.push_back(x);//0x.up = true; x.down = false;x.right = false;x.left = true;farm.push_back(x);//1x.up = true;x.down = false;x.right = true;x.left = false;farm.push_back(x);//2x.up = false;x.down = true;x.right = false;x.left = true;farm.push_back(x);//3x.up = false;x.down = true;x.right = true;x.left = false;farm.push_back(x);//4x.up = true;x.down = true;x.right = false;x.left = false;farm.push_back(x);//5x.up = false;x.down = false;x.right = true;x.left = true;farm.push_back(x);//6x.up = true;x.down = false;x.right = true;x.left = true;farm.push_back(x);//7x.up = true;x.down = true;x.right = false;x.left = true;farm.push_back(x);//8x.up = false;x.down = true;x.right = true;x.left = true;farm.push_back(x);//9x.up = true;x.down = true;x.right = true;x.left = false;farm.push_back(x);//10x.up = true;x.down = true;x.right = true;x.left = true;farm.push_back(x);//11}int change(char x){//索引return x-'A'+1;}cor find_father(int x,int y){//找根结点if(x == father[x][y].x && y == father[x][y].y){cor root; root.x = x; root.y = y;return root;}else{father[x][y] = find_father(father[x][y].x,father[x][y].y);}return father[x][y];}void merge(cor a,cor b){合并father[a.x][a.y] = b;}void process(int x,int y,elem map[M][N]){//两个方向的处理int _x = x-1;int _y = y;if(_x >= 1 && _x <= n && _y >= 1 && _y <= m && map[x][y].up && map[_x][_y].down){//上下两个图都有pipecor a = find_father(x,y);cor b = find_father(_x,_y);if(!(a.x == b.x && a.y == b.y)) merge(a,b);}_x = x; _y = y-1;if(_x >= 1 && _x <= n && _y >= 1 && _y <= m && map[x][y].left && map[_x][_y].right){//左右cor a = find_father(x,y);cor b = find_father(_x,_y);if(!(a.x == b.x && a.y == b.y)) merge(a,b);}}int main(){vector<elem> farm;//保存11个初始地图elem map[M][N];init(farm);while(cin >>n >>m && (n > 0 && m > 0)){for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){ father[i][j].x = i;father[i][j].y = j;}}for(int i = 1;i <= n;i++){for(int j = 1; j <= m;j++){char x;cin >>x;map[i][j] = farm[change(x)];process(i,j,map);}}int count = 0;for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(i == father[i][j].x && father[i][j].y == j)count++;}}cout <<count <<endl;}return 0;}
- hdu 1198 并查集应用
- hdu 1232 经典并查集应用
- hdu 2860(并查集应用)
- hdu 5441 Travel(并查集应用)
- hdu 5441 并查集的应用
- hdu 1272 并查集的应用
- 并查集的应用:hdu 1213
- HDU 1198 并查集
- HDU 1198(并查集)
- HDU 1198 并查集
- hdu 1198 并查集
- hdu 1198(并查集 )
- hdu 1198 并查集
- hdu 1198并查集
- 并查集应用
- 并查集应用
- 并查集应用
- HDU 1232 & 1213并查集应用 练习
- 笑料
- Android Applications Tutorial 13. Intent
- 一位ALS患者在生命走到尽头前用脚贡献了最后一个代码补丁
- NDK r6 新的特性
- 进程上下文与中断上下文
- hdu 1198 并查集应用
- 企业管理软件领域的新挑战
- 在对话框中加入属性页
- hql介绍
- Ubuntu12.04 开机启动菜单 删除多余的内核(旧版本) 调整不同操作系统的启动顺序
- linux终端下,使用ls时,显示的文件颜色,都表示什么含义,在哪里可以查看和修改
- 作个笔记:Google正式开源LevelDB项目
- 海量数据排序和查找问题
- 图论做过的题