首页 > 编程语言 >网络中计算源宿节点之间最大权重路径-JAVA实现

网络中计算源宿节点之间最大权重路径-JAVA实现

时间:2023-03-28 21:23:32浏览次数:62  
标签:JAVA int 复杂度 源宿 potatoNum 数组 权值 节点

题解 | #权值最大的路径#_牛客博客 (nowcoder.net)【转载】

题意整理

  • 给定一个有向无环图,每个节点都有一个权值。
  • 求所有路径中,节点权值和最大的路径。

方法一(记忆化递归)

1.解题思路

  • 递归终止条件:跟新完所有的节点。
  • 递归如何推进:每跟新完一个后置节点,就将当前后置节点作为新的起点进行递归。

2.代码实现

import java.util.*;
 
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param potatoNum int一维数组 依次表示序号为1,2,3..的节点的权值
     * @param connectRoad int二维数组 每个一维数组[x,y]表示从第x号到第y号有路
     * @return string
     */
    int n;
    //权值数组
    int[] w;
    //路径数组
    String[] path;
    int[] potatoNum;
    //邻接矩阵
    int[][] graph;
 
    public String digSum (int[] potatoNum, int[][] connectRoad) {
        //初始化
        this.n=potatoNum.length;
        this.w=new int[n+1];
        this.path=new String[n+1];
        this.potatoNum=potatoNum;
        this.graph=new int[n+1][n+1];
 
        //给邻接矩阵赋值
        for(int[] road:connectRoad){
            graph[road[0]][road[1]]=1;
        }
        for(int i=1;i<=n;i++){
            //跟新对应节点,小于说明没有跟新过
            if(w[i]<potatoNum[i-1]){
                w[i]=potatoNum[i-1];
                path[i]=String.valueOf(i);
                dfs(i);
            }
        }
        int max=0;
        String res="";
        //求最大权值对应的路径
        for(int i=1;i<=n;i++){
            if(max<w[i]){
                max=w[i];
                res=path[i];
            }
        }
        return res;
    }
 
    private void dfs(int i){
        //遍历后置节点
        for(int j=1;j<=n;j++){
            //跟新以j结尾的路径
            if(graph[i][j]==1&&w[j]<w[i]+potatoNum[j-1]){
                w[j]=w[i]+potatoNum[j-1];
                path[j]=path[i]+"-"+String.valueOf(j);
                dfs(j);
            }
        }
    }
}

3.复杂度分析

  • 时间复杂度:递归的最大深度是n,递归外面还有一层遍历,其他循环都是线性的,所以时间复杂度为�(�2)O(n2)。
  • 空间复杂度:需要额外大小为�+1n+1的权值数组和路径数组,以及大小为(�+1)2(n+1)2的邻接矩阵,所以空间复杂度为�(�2)O(n2)。

方法二(动态规划)

1.解题思路

  • 首先初始化权值数组和路径数组。
  • 然后初始化图的邻接矩阵,记录每个节点可达的后置节点。
  • 从后往前依次确认起点为该节点的对应路径中权值最大的,这一步,遍历所有后置节点,找权值最大的进行拼接,再跟新权值数组和路径数组。
  • 最后取权值最大的路径。

2.代码实现

import java.util.*;
 
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param potatoNum int一维数组 依次表示序号为1,2,3..的节点的权值
     * @param connectRoad int二维数组 每个一维数组[x,y]表示从第x号到第y号有路
     * @return string
     */
    public String digSum (int[] potatoNum, int[][] connectRoad) {
        //初始化权值数组和路径数组
        int n=potatoNum.length;
        int[] w=new int[n+1];
        String[] path=new String[n+1];
 
        //初始化图的邻接矩阵
        int[][] graph=new int[n+1][n+1];
        for(int[] road:connectRoad){
            graph[road[0]][road[1]]=1;
        }
        //从后往前依次确认起点为该节点的对应路径中权值最大的
        for(int i=n;i>=1;i--){
            w[i]=potatoNum[i-1];
            path[i]=String.valueOf(i);
            int max=0;
            int id=0;
            //遍历所有后置节点,找权值最大的进行拼接
            for(int j=1;j<=n;j++){
                if(graph[i][j]==1&&max<w[j]){
                    max=w[j];
                    id=j;
                }
            }
            //跟新权值数组和路径数组
            if(max==0) continue;
            w[i]+=w[id];
            path[i]=path[i]+"-"+path[id];
        }
        int max=0;
        String res="";
        //取权值最大的路径
        for(int i=1;i<=n;i++){
            if(max<w[i]){
                max=w[i];
                res=path[i];
            }
        }
        return res;
    }
}

3.复杂度分析

  • 时间复杂度:寻找后置节点时,需要一层遍历,外面还有一层遍历,其他循环都是线性的,所以时间复杂度为�(�2)O(n2)。
  • 空间复杂度:需要额外大小为�+1n+1的权值数组和路径数组,以及大小为(�+1)2(n+1)2的邻接矩阵,所以空间复杂度为�(�2)O(n2)。

标签:JAVA,int,复杂度,源宿,potatoNum,数组,权值,节点
From: https://www.cnblogs.com/Limer98/p/17266738.html

相关文章

  • java方法-二维数组
    多维数组多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一维数组二维数组int[][]a=newint[2][5];解析:以上二维数组a可以......
  • 动力节点王鹤SpringBoot3学习笔记——JDK新特性
    一、JDK关注的新特性1.1搭建学习环境JDK:JDK19OpenJDK:https://jdk.java.net/19/LibericaJDK:https://bell-sw.com/pages/downloads/,是一个OpenJDK发行版,为云原生,......
  • javascript中出现undefined的四种情况
    javascript中出现undefined的四种情况https://www.jianshu.com/p/b0700cce78c8一,函数没有返回值,或者返回值为空,出现undefined例:1)functionshow(){//没有返回值}vara=sh......
  • Java工具集介绍10_24
    Java工具集介绍10_241)Perst项目Perst项目是一个面向对象的、开源的Java数据库,来自于McObject,发布于2003年。最近McObject发布了PerstLite,是Perst的最新版本,面向JavaME移动......
  • Java对象内存管理
    对象内存管理介绍编译好的java程序需要运行在JVM中;JVM为java程序提供并管理所需要的内存空间:“栈”、“堆”、“方法区”三个区域,分别用于存储不同的数据。堆存......
  • 转载:JavaScript文字转语音_SpeechSynthesisUtterance语音合成的使用
    原文链接:https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&mid=2649118413&idx=3&sn=3385dee75bcffa307baa79c3cde4095b&chksm=be587160892ff87605cf347eddad2ad7a55a95......
  • Javascript 加密解密方法
    本文链接Javascript和我之前发的python加密以及go加密解密不一样不需要导那么多的库只需要安装几个库其中需要了解最多的crypto-js具体就不多介绍了直接上官......
  • Java官方笔记3Java语言基础
    变量InstanceVariables(Non-StaticFields)实例变量(非静态变量)一个类可以创造多个实例,实例中的变量叫做实例变量,相互独立。ClassVariables(StaticFields)类变量(......
  • 【面试专栏】Java创建多线程的五种方式
    1.继承Thread类importlombok.extern.slf4j.Slf4j;importorg.junit.jupiter.api.Test;/***继承Thread类创建多线程单元测试**@authorCL*/@Slf4jpublic......
  • 【面试专栏】Java5 - Future,基本使用
    1.简介  在使用多线程开发中,不论是继承Thread类还是实现Runnable接口方式,都无法非常方便的获取异步任务执行的结果。在JDK1.5提供了和Runnable类似但多了返回值的Calla......