首页 > 其他分享 >hdu1213并查集

hdu1213并查集

时间:2024-05-04 23:45:26浏览次数:10  
标签:lda hdu1213 int 查集 ++ nextInt ld sc

第一种方法是定义每个数的老大是其自身,通过每次输入的两个数,找到它两的老大,比较大小,循环将所有大的那个老大改为小的那个数,最后输出有几个老大是其自身,案例都能过,提交就错,不知错哪了......

点击查看代码
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[i] = ld[a-1];
			}			
		}
		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;
	}
}

标签:lda,hdu1213,int,查集,++,nextInt,ld,sc
From: https://www.cnblogs.com/xiaohuangTX/p/18172967

相关文章

  • 边权并查集之奇偶游戏
    题目传送门:https://www.acwing.com/problem/content/241///懒得手敲题目先给一下题解:#include<iostream>#include<unordered_map>//这个题目有两个点要想明白,一个是点到根的距离标志着这个点的性质,且在路径压缩的过程中此点不会改变//第二点就是在出现新的关系,也就是要将两......
  • [算法学习笔记] 并查集
    提示:本文并非并查集模板讲解,是在模板基础上的进一步理解以及拓展。Review并查集可以用来维护集合问题。例如,已知\(a,b\)同属一个集合,\(b,c\)同属一个集合。那么\(a,b,c\)都属一个集合。并查集分为合并,查询操作。定义\(fa_i\)表示点\(i\)的父亲。为了降低复杂度,在fi......
  • 并查集
    1.0并查集概念对于具有传递性质、联通集合的题目可以考虑并查集。1.1并查集模板声明:以下模板来自于https://xuq7bkgch1.feishu.cn/docx/CAbedNJ5KobvinxdyKgcKsrlnrd。有n个数,编号是1~n,最开始每个数各自在一个集合中,现在要进行m个操作,操作共有两种:1.Mab,将编号为a......
  • 528. 奶酪(并查集orBFS)
    题面如下:https://www.acwing.com/problem/content/530/大致思路是:合并所有连接的空洞,判断下表面的空洞和上表面的空洞是否是同一集合集合#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>usingnamespacestd;constintN......
  • 倍增并查集
    如果你既会倍增,又会并查集,那你一定会倍增并查集吧!link数据范围明示\(O(n^2)\)无法通过。众所周知,倍增是\(O(\logn)\)的,并查集近似\(O(n)\)的,它们结合一下不就能过了吗?先来重新考虑一下倍增的本质。倍增倍增最经典的用法是ST表。我们将一个区间拆成两个长为\(2^k\)......
  • 928. 尽量减少恶意软件的传播 II【并查集加暴力删边判断】
    题意不是很清晰:1.比如对于graph=[[1,1,0],[1,1,1],[0,1,1]],initial=[0,1]来说,可以发现结点的链接情况是0-1-2,感染源结点是0和1,若是按之前题目的要求,移除0和1都不会减少最终感染个数,但是应该返回结点0,因为其index小。但是应用此题的条件,就一定要返回结点1,因为移除结点1之......
  • P3295 [SCOI2016] 萌萌哒(倍增并查集)
    题意简述有一个长为\(n\)的数字序列\(s\),有\(q\)组限制\(l_1,r_1,l_2,r_2\)形如\(s_{l_1,\cdots,r_1}=s_{l_2\cdots,r_2}\),求满足所有限制的\(s\)的方案数,数字序列不能有前导0。\(n,q\le10^5\),保证\([l_1,r_1]\)和\([l_2,r_2]\)大小相等。分析字符之间的等量......
  • 2019年蓝桥杯省赛-修改数组(并查集)
    0.题目时间限制:1.0s内存限制:256.0MB本题总分:20分【问题描述】给定一个长度为N的数组A=[A1,A2,···AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,···,AN。当修改Ai时,小明会检查......
  • 蓝桥杯-并查集-合根植物
    0.题目1.解析1.1并查集思路主要三大模板功能1.初始化(init)2.寻找父节点(find)3.合并(merge)我们在find中可以使用路径压缩简化运算,缩短运行时间而启发式合并则可以将运行时间压缩,由O(n)到o(logn)代码#include<bits/stdc++.h>usingnamespacestd;constintMaxn......
  • 并查集
    介绍并查集主要用于处理一些不相交集合的合并问题,一些常见的用途有求联通子图,求最小生成树的Kruskal算法和求最近公共祖先等。并查集的基本操作主要有:初始化查询合并操作初始化假设有编号为1,2,3……,n的n个元素,我们用一个数组fa[]来储存每个元素的父节点。一开始,我们先将......