union-find算法

来源:互联网 发布:交换机端口抓包 编辑:程序博客网 时间:2024/05/16 11:50

一、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 stubScanner 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 stubScanner 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 stubScanner 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
原创粉丝点击