zoukankan      html  css  js  c++  java
  • 数据结构——不相交集(并查集)

    目的:解决等价问题。

    表示方法:森林,底层实现用数组

    主要操作:find()、union()

    优化手段:

    ①find()时路径压缩

    ②union()时按规模合并、按树高合并(依据情况而定)

    Java实现:

    class DisjointSet {
    	int father[];
    	DisjointSet(){
    		
    	}
    	DisjointSet(int n) {
    		this.father = new int[n];
    		for (int i = 0; i < n; i++)
    			father[i] = i;
    	}
    
    	int find(int x) {
    		if (x != father[x])
    			father[x] = find(father[x]); // 回溯、压缩路径
    		return father[x];
    	}
    
    	void union(int x, int y) {
    		x = find(x);
    		y = find(y);
    		if (x == y)
    			return;
    		if (x < y) {
    			if (father[y] == y)
    				father[x] = father[x] == x ? -2 : father[x] - 1;
    			else
    				father[x] += father[y];
    			father[y] = x;
    		} else {
    			if (father[x] == x)
    				father[y] = father[y] == y ? -2 : father[y] - 1;
    			else
    				father[y] += father[x];
    			father[x] = y;
    		}
    	}
    }
    

     解决问题:迷宫生成问题、树节点的最近祖先、连通回路等

  • 相关阅读:
    将Infopath转成PDF
    调用MOSS API取document时出现out of memeory错误
    jquery dialog中mvc客户端验证无效
    Windows Service开发点滴20130622
    CentOS
    nginx
    VIM
    nodejs weixin 笔记
    nodejs mysql
    nodejs 笔记
  • 原文地址:https://www.cnblogs.com/tonyluis/p/5700993.html
Copyright © 2011-2022 走看看