【Union Find】JAVA implementation

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

class UF
{
	private int[] id;
	private int count;

	public UF(int N)
	{
		count = N;
		id = new int[N];
		for (int i = 0; i < N; i++) {
			id[i] = i;
		}
	}
	public int count(){
		return count;
	}
	public int find(int p){
		while (p != id[p]) {
			p = id[p];
		}
		return p;
	}
	public boolean connected(int p, int q){
		return find(p) == find(q);
	}
	public void union(int p, int q){
		int proot = find(p);
		int qroot = find(q);

		if (proot == qroot) {
			return;
		}
		id[proot] = qroot;
		count--;
	}
	public String toString()
	{
		return Arrays.toString(id);
	}
}

public class Main {

    public static void main(String[] args)
    {
        Scanner jin = new Scanner(System.in);
        int N = jin.nextInt();
        UF uf = new UF(N);
        while (jin.hasNext()) {
			int p = jin.nextInt();
			int q = jin.nextInt();
			if (uf.connected(p, q)) {
				continue;
			}
			uf.union(p, q);
		}
        System.out.println(uf.count());

        System.out.println(uf);

    }
}

对两棵树的合并操作做优化,引入变量size表示这棵树的结点个数,合并时,总是使size小的链接到size大的树。这样合并得到的森林,如果有N个结点,那么树的深度

不会超过lgN。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

class UF
{
	private int[] id;
	private int[] size;
	private int count;

	public UF(int N)
	{
		count = N;
		id = new int[N];
		size = new int[N];
		for (int i = 0; i < N; i++) {
			id[i] = i; size[i] = 1;
		}
	}
	public int count(){
		return count;
	}
	public int find(int p){
		while (p != id[p]) {
			p = id[p];
		}
		return p;
	}
	public boolean connected(int p, int q){
		return find(p) == find(q);
	}
	public void union(int p, int q){
		int proot = find(p);
		int qroot = find(q);

		if (proot == qroot) {
			return;
		}
		if (size[proot] < size[qroot]) { id[proot] = qroot; size[qroot] += size[proot];}
		else {id[qroot] = proot; size[proot] += size[qroot];}
		count--;
	}
	public String toString()
	{
		return Arrays.toString(id);
	}
}

public class Main {

    public static void main(String[] args)
    {
        Long n;
        //System.out.println(Long.MAX_VALUE);
        Scanner jin = new Scanner(System.in);
        int N = jin.nextInt();
        UF uf = new UF(N);
        while (jin.hasNext()) {
			int p = jin.nextInt();
			int q = jin.nextInt();
			if (uf.connected(p, q)) {
				continue;
			}
			uf.union(p, q);
		}
        System.out.println(uf.count());

        System.out.println(uf);

    }
}

【Union Find】JAVA implementation,布布扣,bubuko.com

时间: 2024-11-05 12:23:15

【Union Find】JAVA implementation的相关文章

【已解决】java.lang.IllegalArgumentException: column &#39;_id&#39; does not exist

今天用到SimpleCursorAdapter来适配ListView的数据,依旧记得SimpleCursorAdapter必须匹配一个字段名为_id的主键列,一开始我用SQLiteDatabase的rawQuery方法拼sql查询,因为是用SELECT * FROM table_name,所以一切正常. 后来我用query方法就挂了,抛出了java.lang.IllegalArgumentException: column '_id' does not exist异常,然后我发现原来是参数col

【工具类】JAVA 以行为单位读取文件并比对

package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 以行为单位读取文件并比对,显示不同行 * @author fushihua-wb * @date 2014-7-11 */ pu

【初学者常见问题】Java中关于static的谜团

static是Java中的一个关键字,它能够声明在方法中,如public static void test(),这就是一个静态方法,他可以通过类名.方法名来调用,当然也可以给变量声明,如public static int a = 10; 它就是一个静态变量,也可以通过上述类名.方法名来调用. 以前写过一篇<反思--基础很重要>的文章,基础的扎实往往在后面的道路中会如鱼得水.那次只给出题目,是一道在笔试过程中经常出现的题目,这几天读<深入理解java虚拟机>这本书又有了对这段代码深入

【Socket编程】Java通信是这样炼成的

简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 Java 中的网络编程—— Socket 通信. 网络基础知识 两台计算机要通过网络进行通信,必须具备如图所示的条件: a.唯一的标识(IP地址): b.需要共同的语言(协议): c.辨别不同应用程序(端口号). 其中的重要概念如下: 1.IP地址 每台计算机的唯一标识,用来区分网络中的不同主机,

【源码】java包装类总结

1.包装类除了Void和Character,其他六个全部都继承自Number.Number是一个抽象类.如下: public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); public abstract float floatValue(); public abstract double double

【maven+junit】 java生成指定为位数的随机密码

原文:[maven+junit] java生成指定为位数的随机密码 源代码下载地址:http://www.zuidaima.com/share/1575542151629824.htm 网上整理的.大家有什么更好的方案可以分享下. 版权声明:本文为博主原创文章,未经博主允许不得转载.

【夯实基础】java关键字synchronized 详解

尊重版权:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个sy

【原码】java 高并发、高性能、分布式 java后台框架

获取[下载地址]   QQ: 313596790A 代码生成器(开发利器);     增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 安全权限框架shiro ;  Shiro 是一个用 Java 语言实现的框架,通过

【五年】Java打怪升级之路

之前写过一篇帖子,就是关于工作经验分享的,最近很多人私信我,所以博客这边再分享一次 这几年来,我最大的感想就是一句话:多看.多写.多想.多问.多分享.多优化.多运动... 1.[多看] 读万卷书,行万里路.多看书,多看别人写的代码,多看别人的问题,多看相关技术书,多看文档,多看.....  很多东西都需要我们用双眼来看,当然,很多人肯定会说,哪有那么多时间来做这些事,我只能回答:挤时间. 不管你是刚出校门正在迷茫,也不管你是工作几年,成就不菲,[多看]绝对试用任何一个阶段的人.有些人遇到问题不知