Java常见算法(六)【省份数量- 分组算法:深度优先、广度优先、并查集 】

2023-11-04

省份数量-经典的分组算法

https://www.bilibili.com/video/BV1Jv411A7Ty?p=34
在这里插入图片描述
比如现在有三个城市:A城市、B城市、C城市,其中 A 城市与 B城市相连,C城市与A、B城市都不相连。
画图展示:
在这里插入图片描述
然后我们得到的数组是这样的:
例如:A城市与自己相连,A城市与B城市相连,A城市与C不相连,所以得到:{1,1,0 } 。后面两个城市的关系也是类似,不再描述…

所以最终用数组表示三个城市的关系是这样的:

{ {1,1,0 } , { 1,1,0 } , { 0, 0, 1} }

这里说明一下我们的入参和出参,入参是一个城市关系的数组,出参是省份数量。 省份数量是这样认定的,比如我们上面提到的A、B、C 城市关系,出参就是 2 ,我们认为只要是关联的的城市,就在同一个省份。

所以:

{1,0,0 } , { 0,1,0 } , { 0, 0, 1}

此数组的城市关系出参为 3,也就是说有三个省份。

1、深度优先遍历

https://www.bilibili.com/video/BV1Jv411A7Ty?p=35

 //1、深度优先遍历
    public static int getProvince(int[][] citysConnected){
        int citys=citysConnected.length;
        boolean[] visited = new boolean[citys];
        int provinces=0;//计数器
        for (int i = 0; i < citys; i++) {
            if(!visited[i]){
                //递归,深度优先
                dfs(i,citys,visited,citysConnected);
                provinces++;
            }
        }
        return provinces;
    }

    private static void dfs(int i, int citys, boolean[] visited, int[][] citysConnected) {
        for (int j = 0; j < citys; j++) {
            if(citysConnected[i][j]==1 && !visited[j]){
                visited[j]=true;
                dfs(j,citys,visited,citysConnected);
            }
        }
    }

2、广度优先

https://www.bilibili.com/video/BV1Jv411A7Ty?p=36

 //2、广度优先
    public static int getProvince1(int[][] citysConnected){
        int citys=citysConnected.length;
        boolean[] visited = new boolean[citys];
        int provinces=0;//计数器
        Queue<Integer> queue=new LinkedList<Integer>();
        for (int i = 0; i < citys; i++) {
            if(!visited[i]){
                queue.offer(i);
                while (!queue.isEmpty()){
                    int k=queue.poll();
                    visited[k]=true;
                    for (int j = 0; j <citys ; j++) {
                        if(citysConnected[i][j]==1 && !visited[j]){
                            queue.offer(j);
                        }
                    }
                }
                provinces++;
            }
        }
        return provinces;
    }

3、并查集 算法

https://www.bilibili.com/video/BV1Jv411A7Ty?p=37

 //3、并查集
    private static int mergeFind(int[][] citysConnected){
        int citys = citysConnected.length;
        int[] head=new int[citys];
        int[] level=new int[citys];
        for (int i = 0; i <citys ; i++) {
            head[i]=i;
            level[i]=1;
        }
        for (int i = 0; i <citys ; i++) {
            for (int j = i+1; j <citys ; j++) {
                if(citysConnected[i][j]==1){
                    merge(i,j,head,level);
                }
            }
        }
        int count=0;
        for (int i = 0; i <citys ; i++) {
            if(head[i]==i){
                count++;
            }
        }
        return count;
    }

    //合并
    private static void merge(int x, int y, int[] head, int[] level){
        int i=find(x,head);
        int j=find(y,head);
        //如果根节点一样
        if(i==j){
            return;
        }
        if(level[i] <= level[j]){
            head[i]=j;
        }else {
            head[j]=i;
        }
        if(level[i]==level[j]){
            level[i]++;
            level[j]++;
        }
    }

    //查找
    private static int find(int x,int[] head){
        if(head[x]==x){
            return x;
        }
        head[x]=find(head[x],head);
        return head[x];
    }

实验源码

package com.example.rabbitmq;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.LinkedList;
import java.util.Queue;

@SpringBootTest
/*
    省份数量

 */
class SuanfaApplicationTests20 {

    //1、深度优先遍历
    public static int getProvince(int[][] citysConnected){
        int citys=citysConnected.length;
        boolean[] visited = new boolean[citys];
        int provinces=0;//计数器
        for (int i = 0; i < citys; i++) {
            if(!visited[i]){
                //递归,深度优先
                dfs(i,citys,visited,citysConnected);
                provinces++;
            }
        }
        return provinces;
    }

    private static void dfs(int i, int citys, boolean[] visited, int[][] citysConnected) {
        for (int j = 0; j < citys; j++) {
            if(citysConnected[i][j]==1 && !visited[j]){
                visited[j]=true;
                dfs(j,citys,visited,citysConnected);
            }
        }
    }

    //2、广度优先
    public static int getProvince1(int[][] citysConnected){
        int citys=citysConnected.length;
        boolean[] visited = new boolean[citys];
        int provinces=0;//计数器
        Queue<Integer> queue=new LinkedList<Integer>();
        for (int i = 0; i < citys; i++) {
            if(!visited[i]){
                queue.offer(i);
                while (!queue.isEmpty()){
                    int k=queue.poll();
                    visited[k]=true;
                    for (int j = 0; j <citys ; j++) {
                        if(citysConnected[i][j]==1 && !visited[j]){
                            queue.offer(j);
                        }
                    }
                }
                provinces++;
            }
        }
        return provinces;
    }

    //3、并查集
    private static int mergeFind(int[][] citysConnected){
        int citys = citysConnected.length;
        int[] head=new int[citys];
        int[] level=new int[citys];
        for (int i = 0; i <citys ; i++) {
            head[i]=i;
            level[i]=1;
        }
        for (int i = 0; i <citys ; i++) {
            for (int j = i+1; j <citys ; j++) {
                if(citysConnected[i][j]==1){
                    merge(i,j,head,level);
                }
            }
        }
        int count=0;
        for (int i = 0; i <citys ; i++) {
            if(head[i]==i){
                count++;
            }
        }
        return count;
    }

    //合并
    private static void merge(int x, int y, int[] head, int[] level){
        int i=find(x,head);
        int j=find(y,head);
        //如果根节点一样
        if(i==j){
            return;
        }
        if(level[i] <= level[j]){
            head[i]=j;
        }else {
            head[j]=i;
        }
        if(level[i]==level[j]){
            level[i]++;
            level[j]++;
        }
    }

    //查找
    private static int find(int x,int[] head){
        if(head[x]==x){
            return x;
        }
        head[x]=find(head[x],head);
        return head[x];
    }

    @Test
    public void sf0(){
        //城市关系 1
        int[][] city1=new int[][]{ {1,1,0 } , { 1,1,0 } , { 0, 0, 1} };
        //城市关系 2
        int[][] city2=new int[][]{ {1,0,0 } , { 0,1,0 } , { 0, 0, 1} };
        System.out.println("--------深度优先--------");
        System.out.println(getProvince(city1));
        System.out.println(getProvince(city2));

        System.out.println("--------广度优先--------");
        System.out.println(getProvince1(city1));
        System.out.println(getProvince1(city2));

        System.out.println("--------并查集--------");
        System.out.println(mergeFind(city1));
        System.out.println(mergeFind(city2));


    }

}

结果:

--------深度优先--------
2
3
--------广度优先--------
2
3
--------并查集--------
2
3


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java常见算法(六)【省份数量- 分组算法:深度优先、广度优先、并查集 】 的相关文章

随机推荐

  • maven安装并配置后报错:当前目录下缺少pom.xml

    问题 默认你已经解压了maven文件且配置好了 etc profile 输入 mvn v 准备收获胜利的果实 此时却报错 ERROR The goal you specified requires a project to execute
  • scala学习-11-package object

    1 概述 Scala中的下划线到底有多少种应用场景 1 作为 通配符 类似Java中的 如import scala math 2 作为一个整体 告诉编译器你希望将某个参数当作参数序列处理 例如val s sum 1 to 5 就是将1 to
  • centos 8的官方国内镜像(阿里巴巴)

    阿里巴巴云提供了centos 8的官方国内镜像 使用户能够更快地下载和安装centos 以下是阿里centos 8镜像的简介 镜像特点 支持 http https ftp rsync 协议 同步频率高 保证镜像源的及时性和稳定性 支持 ip
  • problem(3):python IDE和python解释器

    为什么写这篇文章呢 遇到了下面的问题 相同的解释器 如果运行angr库的代码 会出现 这样的情况 但是用spyder IDE 会显示正常 很奇怪 应该就是IDE的原因 IDE的循环导入问题 检查IDE配置 如果可能 尝试在不同的IDE中运行
  • vue高德地图绘制行政区边界

  • 吴恩达老师深度学习视频课笔记:单隐含层神经网络公式推导及C++实现(二分类)

    关于逻辑回归的公式推导和实现可以参考 http blog csdn net fengbingchun article details 79346691 下面是在逻辑回归的基础上 对单隐含层的神经网络进行公式推导 选择激活函数时的一些经验 不
  • Jenkins 安装及使用 ( Jenkins 部署 Maven 项目、Jenkins 部署 Vue 项目)

    Jenkins 安装及使用 Jenkins 部署 Maven 项目 Jenkins 部署 Vue 项目 一 准备阶段 1 组件及版本 2 Jenkins部署方式 3 查看防火墙的状态 二 Jenkins安装部署 1 密码 2 登录 3 选择
  • 软件工程学习(九)RUP与UML的关系

    UML是建模语言 可以用来表示软件的动态 静态方面 RUP是软件工程过程 要来描述软件生命周期过程 每一个过程都可以用UML来描述
  • 毕业设计 - ESP32单片机疫情防交叉感染洗手液分配系统 -物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 API链接 用于获取Corona实时数据 电路图 为Covid19 Tracker编程ESP32 使用Covid19 Tracker测试自动洗手液 5 最后 0 前言
  • MySQL主从复制配置详解

    1 配置环境 操作系统 两台CentOS 7 6的Linux系统 数据库版本 MySQL 5 6 39 主服务器IP 192 168 0 1 从服务器IP 192 168 0 2 2 安装数据库 之前已经给小伙伴们详细的讲解了CentOS安
  • android平台一些网页不能正常打开的问题

    最近发现在android平台一些网页怎么也打不开 尝试更改apn设置也无效 还发现这些网页在ubuntu系统下也是打不开的 最后经过查阅和尝试解决了这个问题 在此做下记录 在linux平台proc文件系统下存在一个文件即 proc sys
  • AI 绘画基础 - 细数 Stable Diffusion 中的各种常用模型 【 魔导士装备图鉴】

    AI 绘画新手魔导士在刚开始玩 Stable Diffusion 时总会遇到各种新的概念 让人困惑 其中就包括各种模型和他们之间的关系 魔法师入门得先认识各种法师装备 各种模型 让我们遇到问题知道使用何种装备来协助自己发挥更大的效果 saf
  • SpringBoot @JsonField注解格式化日期失效

    昨天在进行登陆测试返回数据格式时 前端显示的日期都是以标准时间格式显示的 因为后端数据库定义的datetime类型 实体定义的date类型 以json格式返回给前端后 日期都格式化为标准类型 一看这个问题 就想到 JsonField注解 直
  • C与C++的函数相互调用

    无法直接调用原因 C 和 C 的函数可以相互调用 但需要一些特殊的注意事项 因为它们有不同的编译和链接规则以及一些语法差异 链接规则 C 语言的链接器通常使用 C 标准的函数命名和调用约定 而 C 链接器使用 C 的函数命名和调用约定 这意
  • c 语言private用法,举例分析private的作用(c/c++学习)

    c 中private的用处 我知道我们可以用 public 中的值 把private中的数据给提出来 但是还是搞不懂private该怎么用 或者说在一个具体程序中 private有什么用 class fun public void setn
  • HTTP协议版本检测

    HTTP 2 0在2015年就已经正式发布了 但是现在大部分网站还在使用HTTP 1 1协议 具体怎么查看网站采用的是HTTP 1 1 还是HTTP 2 0呢 本篇就介绍几种检测HTTP协议版本的方法 所有的操作都是基于Chrome浏览器
  • Week 2 Git& Github: Branch

    首先进入git目录 建议通过windows powershell操作 git branch new branch 创建一个新分支 git checkout branch 跳转到指定分支 git checkout b branchname 创
  • Spring MVC Controller传递枚举值示例

    功能描述 本文将通过一个小示例 展示在请求参数中传递枚举值 枚举定义 角色类定义 public enum RoleEnum EMPLOYEE short 1 Employee MANAGER short 2 Manager private
  • echarts前后端交互数据_前后端交互技术有哪些

    我们都知道 一个完整的IT项目是由多个不同岗位的成员共同完成 包括UI设计 前端开发 后端开发 测试等 为了实现项目的完整性 前后端需要运用技术实现联通 不过 前后端交互技术有哪些 参加郑州Web前端培训班会学吗 且看小编的分析 目前常用的
  • Java常见算法(六)【省份数量- 分组算法:深度优先、广度优先、并查集 】

    文章目录 省份数量 经典的分组算法 1 深度优先遍历 2 广度优先 3 并查集 算法 实验源码 省份数量 经典的分组算法 https www bilibili com video BV1Jv411A7Ty p 34 比如现在有三个城市 A城