hdu 1198 并查集应用

本文介绍了一种使用并查集数据结构解决特定地图上水源数量计算的问题。通过输入不同形状的土地,并根据土地间的连接关系进行集合合并,最终统计独立集合的数量即所需水源数。

   其实可能是因为知道是用并查集做的原因啦,一下就看出题意了,明显是并查集思想,每次输入地图中的一块,检测这一块与它顶头的那块可不可以相通

如果可以合并集合;同理检测其与它左边的那一块;最后遍历一遍看有多少个根结点即要多少个水源

下面是代码,有点乱

#include<iostream>
#include<vector>

#define M 55
#define N 55

using 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);//0
	x.up = true; 
	x.down = false;
	x.right = false;
	x.left = true;
	farm.push_back(x);//1
	x.up = true;
	x.down = false;
	x.right = true;
	x.left = false;
	farm.push_back(x);//2
	x.up = false;
	x.down = true;
	x.right = false;
	x.left = true;
	farm.push_back(x);//3
	x.up = false;
	x.down = true;
	x.right = true;
	x.left = false;
	farm.push_back(x);//4
	x.up = true;
	x.down = true;
	x.right = false;
	x.left = false;
	farm.push_back(x);//5
	x.up = false;
	x.down = false;
	x.right = true;
	x.left = true;
	farm.push_back(x);//6
	x.up = true;
	x.down = false;
	x.right = true;
	x.left = true;
	farm.push_back(x);//7
	x.up = true;
	x.down = true;
	x.right = false;
	x.left = true;
	farm.push_back(x);//8
	x.up = false;
	x.down = true;
	x.right = true;
	x.left = true;
	farm.push_back(x);//9
	x.up = true;
	x.down = true;
	x.right = true;
	x.left = false;
	farm.push_back(x);//10
	x.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){//上下两个图都有pipe
		cor 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;
}

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值