并查集的路径压缩(详细注释)

并查集里的find函数里可以进行路径压缩,是为了更快速的查找一个点的祖先节点,有的题不路径压缩就会超时,所以路径压缩还是很重要的

int find(int a){
	int b=a;  //把初始值赋给b 
	while(a!=fa[a]){
		a=fa[a];  //找到a的祖先节点 
	}
	while(b!=a){  //直到b==a为止 
		int temp=fa[b]; //设一个中间变量为b的父亲节点 
		fa[b]=a; //直接让b的父亲节点为a的祖先节点 
		b=temp;  //b等于b的父亲节点 
	}
	return a;
}

总的来说就是把一个数传进这个函数,先找到这个数的祖先节点,然后把这个数到这个数的祖先节点中的所有点都直接连向a的祖先节点

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Java代码,实现了使用栈解决骑士游历问题,并输出路径坐标和详细注释: ```java import java.util.Stack; public class KnightTour { // 定义常量,表示棋盘大小 private static final int BOARD_SIZE = 8; // 定义骑士在棋盘上的移动方式,分别为横纵坐标的增量 private static final int[] MOVE_X = {2, 1, -1, -2, -2, -1, 1, 2}; private static final int[] MOVE_Y = {1, 2, 2, 1, -1, -2, -2, -1}; // 记录骑士当前的位置 private int curX; private int curY; // 记录骑士已经走过的路径 private Stack<int[]> path; // 记录棋盘上每个位置是否已经访问过 private boolean[][] visited; public KnightTour() { // 初始化骑士起始位置 curX = 0; curY = 0; // 初始化路径栈和访问数组 path = new Stack<>(); visited = new boolean[BOARD_SIZE][BOARD_SIZE]; } public void solve() { // 将起始位置加入路径栈,标记为已访问 path.push(new int[]{curX, curY}); visited[curX][curY] = true; // 骑士需要移动 BOARD_SIZE * BOARD_SIZE 次才能完成游历 for (int i = 1; i < BOARD_SIZE * BOARD_SIZE; i++) { // 根据当前位置,找到下一个可行的位置 int nextX = -1; int nextY = -1; for (int j = 0; j < MOVE_X.length; j++) { int newX = curX + MOVE_X[j]; int newY = curY + MOVE_Y[j]; if (newX >= 0 && newX < BOARD_SIZE && newY >= 0 && newY < BOARD_SIZE && !visited[newX][newY]) { nextX = newX; nextY = newY; break; } } if (nextX == -1 || nextY == -1) { // 如果没有可行的位置,说明游历失败,直接返回 return; } else { // 如果找到了可行的位置,将其加入路径栈,标记为已访问 path.push(new int[]{nextX, nextY}); visited[nextX][nextY] = true; curX = nextX; curY = nextY; } } } public void printPath() { // 将路径栈中的坐标取出,按顺序输出 while (!path.isEmpty()) { int[] coord = path.pop(); System.out.println("(" + coord[0] + ", " + coord[1] + ")"); } } public static void main(String[] args) { KnightTour kt = new KnightTour(); kt.solve(); kt.printPath(); } } ``` 在 `solve()` 方法中,我们使用栈来记录骑士的路径。每次找到一个可行的位置时,我们将其加入路径栈,并标记为已访问。如果没有可行的位置,说明游历失败,直接返回。最后在 `printPath()` 方法中,我们按顺序取出路径栈中的坐标,输出每个位置的坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值