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的更多相关文章

  1. 【面试专栏】JAVA锁机制

    1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数 ...

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

    简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 ...

  3. 【并发编程】Java并发编程传送门

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. [并发编程系列博客传送门](https://www.cnblogs.com/54 ...

  4. 【MongoDB数据库】Java MongoDB CRUD Example

    上一页告诉我们MongoDB 命令入门初探,本篇blog将基于上一篇blog所建立的数据库和表完毕一个简单的Java MongoDB CRUD Example.利用Java连接MongoDB数据库,并 ...

  5. 【JDK1.8】Java 8源码阅读汇总

    一.前言 ​ 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concu ...

  6. 【经验总结】Java在ACM算法竞赛编程中易错点

    一.Java之ACM易错点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  7. 【亲测】Java 接口自动化步骤

    GET请求(Maven) 一. src/main/java 1.[地址--HOST]创建并设置配置文件(后缀名.properties的文本文件):存放接口请求的host地址 2.[地址]TestBas ...

  8. 【五年】Java打怪升级之路

    之前写过一篇帖子.就是关于工作经验分享的,近期非常多人私信我.所以博客这边再分享一次 这几年来,我最大的感想就是一句话:多看.多写.多想.多问.多分享.多优化.多运动... 1.[多看] 读万卷书,行 ...

  9. 【笔试题】Java笔试题知识点

    Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...

随机推荐

  1. Django使用js,css等静态文件的时候,出现mime类型问题

    使用adminLTE模板, return render(request, 'AdminLTE/index.html') 的时候报如下错误且页面渲染异常,css没有效果: Resource interp ...

  2. Bzoj 3145 - [Feyat cup 1.5]Str

    bzoj 3145 - [Feyat cup 1.5]Str Description 给你两个长度\(10^5\)级别的串\(S, T\) 求\(S,T\)的最长模糊匹配公共子串 模糊匹配 : 至多一 ...

  3. MySQL常用查询方法

    SELECT TIME(NOW()); -- 15:23:07 SELECT CURTIME(NOW());-- 15:23:07 SELECT ABS(-4); -- 4 SELECT 5 MOD ...

  4. [Codeforces Round #351 Div. 2] 673A Bear and Game

    A. Bear and Game time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. RMQ 算法 学习整理

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  6. EOJ Monthly 2018.2

    A. 坑爹的售票机 题意 用\(1,5,10,25,50,100\)的纸币买\(n\)张单价为\(p\)的船票,且一次性最多买\(k\)张,求钱数恰好时最少需要多少张纸币. Hard: \(n,k,p ...

  7. Python_代码练习_写一个判断是否为小数的函数

    这两天在学习函数,练习写一个判断是否为小数的函数,看起来蛮简单的,飞速写完很是得意,然后测了一下,发现差得好多呀,这个并不像想象那样简单,我得到的教训是,想要把一个需求哪怕再小的需求考虑周全,都不是件 ...

  8. android的动态代码

    1,Android代码设置Shape,corners,Gradient  (http://blog.csdn.net/houshunwei/article/details/17392409) int ...

  9. Android修改包名的方法,简单粗暴。

    几分钟之内,简单粗暴的修改包名! 序:Android的新手玩家可能对修改包名这件事情很是烦恼,我这里给出一个最快的修改包名的方法,简单粗暴,喜欢的可以收藏一下. 开始修改 第一步:修改自己app mo ...

  10. APACHE 配置虚拟主机和HTTPS

    prepare the running env of os make sure you are using redhat or centen os 7.5 cat /etc/redhat-releas ...