hdu1213并查集

第一种方法是定义每个数的老大是其自身,通过每次输入的两个数,找到它两的老大,比较大小,循环将所有大的那个老大改为小的那个数,最后输出有几个老大是其自身

点击查看代码
import java.util.Scanner;
public class hdu1213 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for (int i = 0; i < n; i++) {
			int num = sc.nextInt();
			int nn = sc.nextInt();
			int[] lda = new int[num]; //定义老大
			for (int j = 0; j < num; j++) {
				lda[j] = j+1;				
			}
			for (int j = 0; j < nn; j++) {
				int a = sc.nextInt();
				int b = sc.nextInt();
				lda = shu(a, b, lda);
			}
			int res = 0;
			for (int j = 0; j < num; j++) {
				if (lda[j]==j+1) {
					res++;
				}
			}
			System.out.println(res);
			/*if (i != n-1) {
                System.out.println();
            }*/
		}
		sc.close();
	}
	/*public static int[] shu(int a,int b,int[] ld) {
		if(ld[a-1]>ld[b-1]) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		for (int i = 0; i < ld.length; i++) {  //每个数的老大是小于它的一个数
			if (ld[i]==ld[b-1]) {              ////错在那终于知道了,下面修改可能先把ld[b-1]修改了。
				ld[i] = ld[a-1];
			}			
		}
		return ld;
	}*/
    public static int[] shu(int a,int b,int[] ld) {
		if(ld[a-1]==ld[b-1]) {
			return ld;
		}
		int min = Math.min(ld[a-1],ld[b-1]);
		int max = Math.max(ld[a-1],ld[b-1]);
		for (int i = 0; i < ld.length; i++) {  //每个数的老大是小于它的一个数
			if (ld[i]==max) {
				ld[i] = min;
			}			
		}
		return ld;
	}
}

第二种方法是通过找根节点的方式,定义每个老大的根节点是-1,当输入的两个数的老大是不同的时候,将其中一个老大更改。

点击查看代码
import java.util.Scanner;

public class hud1213_1 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		while(n-- > 0) {
			int num = sc.nextInt();
			int nn = sc.nextInt();
			int[] lda = new int[num];
			for (int i = 0; i < lda.length; i++) {
				lda[i] = -1;				
			}
			for (int i = 0; i < nn; i++) {
				int a = sc.nextInt()-1;
				int b = sc.nextInt()-1;
				lda = merg(a, b, lda);
			}
			int res = 0;
			for (int i = 0; i < lda.length; i++) {
				if (lda[i]==-1) {
					res++;
				}	
			}
			System.out.println(res);
		}
		sc.close();
	}
	//寻找根节点
	static int father(int x,int[] lda) {
		int index = x;
		while (lda[index]!=-1) {
			index = lda[index];	
		}
		return index;
	}
	static int[] merg(int a,int b,int[] lda) {
		int x = father(a, lda);
		int y = father(b, lda);
		//如果两个数的根节点不一样 则改变其中一个数的根节点
		if (x!=y) {
			lda[x] = y;
		}
		return lda;
	}
}

posted @ 2024-05-04 23:32  XiaohuangTX  阅读(6)  评论(0编辑  收藏  举报