union-find算法

一、quick-find:

import java.util.Scanner;


public class UF  //quick-find
{
	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 void union(int p, int q)
	{
		int pID = id[p];
		int qID = id[q];
		if (pID == qID) return;
		for (int i = 0; i < id.length; i ++)
			if (id[i] == pID) id[i] = qID;
		count--;
		return;
	}
	public int find(int p)
	{
	 return id[p];	
	}
	public boolean connected(int p, int q)
	{
		return find(p) == find(q);
	}
	public int count()
	{
		return count;
	}

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();
		UF uf = new UF(N);
		while (input.hasNextInt())
		{
			int p = input.nextInt();
			int q = input.nextInt();
			if (uf.connected(p, q)) continue;
			else uf.union(p, q);
		}
		System.out.println(uf.count() + "components");
	}

}
二、quick-union:

import java.util.Scanner;


public class UF  //quick-union
{
	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 void union(int p, int q)
	{
		int pRoot = find(p);
		int qRoot = find(q);
		if (pRoot == qRoot) return;
		id[pRoot] = qRoot;
		count--;
		return;
	}
	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 int count()
	{
		return count;
	}

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();
		UF uf = new UF(N);
		while (input.hasNextInt())
		{
			int p = input.nextInt();
			int q = input.nextInt();
			if (uf.connected(p, q)) continue;
			else uf.union(p, q);
		}
		System.out.println(uf.count() + "components");
	}

}
三加权 quick-union;

import java.util.Scanner;


public class UF  //quick-union
{
	private int[] id;
	private int count;
	private int[] sz;
	public UF(int N)
	{
		count = N;
		id = new int[N];
		sz = new int[N];
		for (int i = 0; i < N; i++)
			id[i] = i;
		for (int i = 0; i < N; i++)
			sz[i] = 1;
	}
	public void union(int p, int q)
	{
		int pRoot = find(p);
		int qRoot = find(q);
		if (pRoot == qRoot) return;
		if (sz[pRoot] < sz[qRoot]) {id[pRoot] = qRoot; sz[qRoot] += sz[pRoot];}
		else {id[qRoot] = pRoot; sz[pRoot] += sz[qRoot];}
		//id[pRoot] = qRoot;
		count--;
		return;
	}
	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 int count()
	{
		return count;
	}

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();
		UF uf = new UF(N);
		while (input.hasNextInt())
		{
			int p = input.nextInt();
			int q = input.nextInt();
			if (uf.connected(p, q)) continue;
			else uf.union(p, q);
		}
		System.out.println(uf.count() + "components");
	}

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值