当前位置: 首页 > news >正文

并查集题目

并查集题目

  • 聚合一块(蓝桥)
  • 合根植物(蓝桥)
  • 等式方程的可满足性
  • 省份数量

并查集(Union-Find)算法是一个专门针对「动态连通性」的算法。双方向的连通。

模板:

class UF {// 连通分量个数private int count;// 存储每个节点的父节点private int[] parent;// n 为图中节点的个数public UF(int n) {this.count = n;parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}// 将节点 p 和节点 q 连通public void union(int p, int q) {int rootP = find(p);int rootQ = find(q);if (rootP == rootQ)return;parent[rootQ] = rootP;// 两个连通分量合并成一个连通分量count--;}// 判断节点 p 和节点 q 是否连通public boolean connected(int p, int q) {int rootP = find(p);int rootQ = find(q);return rootP == rootQ;}public int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];}// 返回图中的连通分量个数public int count() {return count;}
}

聚合一块(蓝桥)

在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int n=scan.nextInt();int m=scan.nextInt();UF uf=new UF(n+1);for(int i=0;i<m;i++){int q=scan.nextInt();int p=scan.nextInt();uf.union(q,p);}System.out.println(uf.count-2);scan.close();}
}
class UF{//连通分量个数int count;//存储每个节点的父节点int[]parent;//创建n个节点的连通图UF(int n){this.count=n;parent=new int[n];for(int i=1;i<n;i++){parent[i]=i;}}//将p和q联通void union(int p,int q){int rootP=find(p);int rootQ=find(q);if(rootP==rootQ){return;}parent[rootQ]=rootP;count--;}int find(int x){if(parent[x]!=x){parent[x]=find(parent[x]);}return parent[x];}int count(){return count;}
}

合根植物(蓝桥)

题目
在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...int m=scan.nextInt();int n=scan.nextInt();UF uf=new UF(m*n+1);int k=scan.nextInt();for(int i=0;i<k;i++){int a=scan.nextInt();int b=scan.nextInt();uf.union(a,b);}System.out.println(uf.count-1);scan.close();}
}
class UF{int count;int[] parent;UF(int n){this.count=n;parent=new int[n];for(int i=1;i<n;i++){parent[i]=i;}}int find(int x){if(parent[x]!=x){parent[x]=find(parent[x]);}return parent[x];}void union(int q,int p){int rootQ=find(q);int rootP=find(p);if(rootP==rootQ){return;}parent[rootP]=rootQ;count--;}
}

等式方程的可满足性

题目
在这里插入图片描述

思路:先执行“= =”的式子, 连通“==”两边的字母。后来执行“! =”的式子,判断“! =”两边的字母是否连通,如果连通就返回false。

class Solution {public boolean equationsPossible(String[] equations) {UF uf=new UF(26);//先排一下序,使先执行“==”,!的ASCLL较小,输出从大到小,后-前Arrays.sort(equations, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return  o2.charAt(1)-o1.charAt(1);}});for(String ele:equations){int q=ele.charAt(0)-'a';int p=ele.charAt(3)-'a';if(ele.charAt(1)=='='){//连通q puf.union(q,p);}else{if(uf.isConnected(q,p)){return false;}}}return true;}
}
class UF{int count;int[]parent;UF(int n){this.count=n;parent=new int[n];for(int i=0;i<n;i++){parent[i]=i;}}void union(int q,int p){int rootQ=find(q);int rootP=find(p);if(rootP==rootQ){return;}parent[rootP]=rootQ;count--;}boolean isConnected(int q,int p){int rootQ=find(q);int rootP=find(p);return rootP==rootQ;}int find(int x){if(x!=parent[x]){parent[x]=find(parent[x]);}return parent[x];}
}

省份数量

题目
在这里插入图片描述

class Solution {public int findCircleNum(int[][] isConnected) {int size=isConnected.length;UF uf=new UF(size);for(int i=0;i<size;i++){for(int j=i+1;j<size;j++){if(isConnected[i][j]==1){uf.union(i,j);}}}return uf.count;}
}class UF {// 连通分量个数int count;// 存储每个节点的父节点private int[] parent;// n 为图中节点的个数public UF(int n) {this.count = n;parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}// 将节点 p 和节点 q 连通public void union(int p, int q) {int rootP = find(p);int rootQ = find(q);if (rootP == rootQ)return;parent[rootQ] = rootP;// 两个连通分量合并成一个连通分量count--;}// 判断节点 p 和节点 q 是否连通public boolean connected(int p, int q) {int rootP = find(p);int rootQ = find(q);return rootP == rootQ;}public int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];}// 返回图中的连通分量个数public int count() {return count;}
}
http://www.lryc.cn/news/534214.html

相关文章:

  • 日志2025.2.9
  • 支持多种网络数据库格式的自动化转换工具——VisualXML
  • Java并发编程笔记
  • 大语言模型实践——基于现有API的二次开发
  • 获取程序运行目录 (jar运行目录)
  • Elasticsearch:如何使用 Elastic 检测恶意浏览器扩展
  • Oracle CDB自动处理表空间不足脚本
  • java-list深入理解(流程图)
  • Vue 中的 keep-alive 组件是什么?
  • 单元测试的入门实践与应用
  • 【大模型】硅基流动对接DeepSeek使用详解
  • [Windows] PDF补丁丁v1.1.0.4627绿色版
  • Oracle 变更redo log文件位置
  • 使用Redis实现业务信息缓存(缓存详解,缓存更新策略,缓存三大问题)
  • 已验证正常,Java输入字符串生成PDF文件
  • android手机安装deepseek-r1:1.5b
  • 51单片机俄罗斯方块清屏函数
  • PLSQL: 存储过程,用户自定义函数[oracle]
  • 深度学习-医学影像诊断
  • 备战蓝桥杯:双指针(滑动窗口)算法之逛花展
  • Linux如何设置软件开机启动呢?
  • Vue(3)
  • 11vue3实战-----封装缓存工具
  • 第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)
  • MySQL 8.0.41 终端修改root密码
  • 微信小程序案例2——天气微信小程序(学会绑定数据)
  • android的Compose 简介
  • 缓存实战:Redis 与本地缓存
  • apisix的real-ip插件使用说明
  • 音视频协议