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. Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?

    懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...

  2. [HNOI2012]矿场搭建(tarjan求点双)

    题目 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无 ...

  3. 洛谷P2668 斗地主 [NOIP2015]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  4. Codevs 2460 == BZOJ 1036 树的统计

     2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...

  5. .NET结束外部进程 C#结束外部进程

    原文发布时间为:2011-02-15 -- 来源于本人的百度文章 [由搬家工具导入] using System;namespace ConsoleApplication2{    class Prog ...

  6. Repeater的使用及其鼠标特效,行链接的使用

    原文发布时间为:2009-04-22 -- 来源于本人的百度文章 [由搬家工具导入] <asp:Repeater ID="rpt" runat="server&qu ...

  7. Android蓝牙介绍

    1. 介绍 自从Android 4.2开始,Android开始使用自己的蓝牙协议栈BlueDroid,而不是bluez BlueDroid可分为两层: - BTE: Bluetooth Embedde ...

  8. 在C#用进程打开cmd与直接手动打开cmd是不一样的

    网上找不着答案,想了一下觉得可能是不同的用户,用set看了一下环境变量果然是不同用户,要改一下 按以下方法改: http://www.cnblogs.com/babycool/p/3569183.ht ...

  9. 寒假week1---二分查找(二分枚举)

    寒假week1---二分查找(二分枚举)1.适用条件:要查找(枚举)的集合有序 && 查找(枚举)的“条件”具有单调性2.什么是“条件”:example: 1.给定一个有序数组,从中查 ...

  10. CodeForces - 16E Fish

    Discription n fish, numbered from 1 to n, live in a lake. Every day right one pair of fish meet, and ...