解题思路:

注意事项:

参考代码:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
	static Map<Integer, UnionNode.Node> pntAndMap = new HashMap<Integer, UnionNode.Node>();
	static Set<UnionNode.Node> nod = new HashSet<UnionNode.Node>();
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int m  = sc.nextInt();
		int n = sc.nextInt();
		int index = 1;
		int[][] a =new int[m+1][n+1];
		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				a[i][j] = index++;
				pntAndMap.put(a[i][j], new UnionNode.Node());
			}
		}
		int k = sc.nextInt();
		for (int i = 0; i < k; i++) {
			UnionNode.Node s = pntAndMap.get(sc.nextInt());
			UnionNode.Node e = pntAndMap.get(sc.nextInt());
			
			if(UnionNode.find(s) != UnionNode.find(e)){
				UnionNode.Union(s, e);
			}
		}
		
		Set<UnionNode.Node> res = new HashSet<>();
		for (int i = 1; i < a.length; i++) {
			for (int j = 1; j < a[i].length; j++) {
				UnionNode.Node node = pntAndMap.get(a[i][j]);
				UnionNode.Node f = UnionNode.find(node);
				res.add(f);
			}
		}
		System.out.println(res.size());
	}
}
class UnionNode{
	
	public static Node find(Node x){
		Node p = x;
		Set<Node> set = new HashSet<>();
		while(p.parent != null){
			set.add(p);
			p = p.parent;
			
		}
		
		for (Node node : set) {
			node.parent = p;
		}
		return p;
	}
	
	public static void Union(Node x, Node y){
		find(y).parent = find(x);
	}
	static class Node{
		public Node parent;
	}
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论