(B卷,200分)- 最小传输时延(Java & JS & Python)

题目描述

某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图表示,其中图的边的值表示结点之间的消息传递时延。

现给定相连节点之间的时延列表times[i]={u,v,w},其中u表示源结点,v表示目的结点,w表示u和v之间的消息传递时延。

请计算给定源结点到目的结点的最小传输时延,如果目的结点不可达,返回-1

注:

  • N的取值范围为[1,100];
  • 时延列表times的长度不超过6000,且 1 <= u,v <= N,0 <= w <= 100;

输入描述

输入的第一行为两个正整数,分别表示网络结点的个数N,以及时延列表的长度M,用空格分隔;

接下来的M行为两个结点间的时延列表[u v w];

输入的最后一行为两个正整数,分别表示源结点和目的结点。

输出描述

起点到终点得最小时延,不可达则返回-1

用例

输入 3 3
1 2 11
2 3 13
1 3 50
1 3
输出 24
说明

题目解析

本题是

的变种题,逻辑几乎一致,题目解析请参考链接博客。

本题采用的是dijkstra算法,即迪杰斯特拉算法求解。

Java算法源码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int n = sc.nextInt();
    int m = sc.nextInt();

    int[][] times = new int[m][3];
    for (int i = 0; i < m; i++) {
      times[i][0] = sc.nextInt();
      times[i][1] = sc.nextInt();
      times[i][2] = sc.nextInt();
    }

    int src = sc.nextInt();
    int dist = sc.nextInt();

    System.out.println(getResult(n, times, src, dist));
  }

  public static int getResult(int n, int[][] times, int src, int tar) {
    HashMap<Integer, ArrayList<int[]>> graph = new HashMap<>();

    for (int[] time : times) {
      int u = time[0], v = time[1], w = time[2];
      graph.putIfAbsent(u, new ArrayList<>());
      graph.get(u).add(new int[] {v, w});
    }

    int[] dist = new int[n + 1];
    Arrays.fill(dist, Integer.MAX_VALUE);
    dist[src] = 0;

    ArrayList<Integer> needCheck = new ArrayList<>();
    while (true) {
      boolean flag = false;

      if (graph.containsKey(src)) {
        for (int[] next : graph.get(src)) {
          int v = next[0], w = next[1];
          int newDist = dist[src] + w;

          if (newDist >= dist[v]) continue;

          dist[v] = newDist;

          if (!needCheck.contains(v)) {
            needCheck.add(v);
            flag = true;
          }
        }
      }

      if (needCheck.size() == 0) break;

      if (flag) {
        needCheck.sort((a, b) -> dist[a] - dist[b]);
      }

      src = needCheck.remove(0);
    }

    return dist[tar] == Integer.MAX_VALUE ? -1 : dist[tar];
  }
}

JavaScript算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let n, m;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [n, m] = lines[0].split(" ").map(Number);
  }

  if (m && lines.length === m + 2) {
    lines.shift();
    let [src, dist] = lines.pop().split(" ").map(Number);
    let times = lines.map((line) => line.split(" ").map(Number));

    console.log(getMinTransDelay(n, times, src, dist));

    lines.length = 0;
  }
});

function getMinTransDelay(n, times, src, tar) {
  const graph = {};

  times.forEach((time) => {
    const [u, v, w] = time;
    graph[u] ? graph[u].push([v, w]) : (graph[u] = [[v, w]]);
  });

  const dist = new Array(n + 1).fill(Infinity);
  dist[src] = 0;

  const needCheck = [];

  while (true) {
    let flag = false;
    graph[src]?.forEach((next) => {
      const [v, w] = next;
      const newDist = dist[src] + w;

      if (newDist >= dist[v]) return;
      dist[v] = newDist;

      if (needCheck.indexOf(v) === -1) {
        needCheck.push(v);
        flag = true;
      }
    });

    if (!needCheck.length) break;

    if (flag) needCheck.sort((a, b) => dist[a] - dist[b]);

    src = needCheck.shift();
  }

  return dist[tar] == Infinity ? -1 : dist[tar];
}

Python算法源码

# 输入获取
import sys

n, m = map(int, input().split())
times = [list(map(int, input().split())) for _ in range(m)]
src, dist = map(int, input().split())


# 算法入口
def getResult(n, times, src, tar):
    graph = {}

    for u, v, w in times:
        if graph.get(u) is None:
            graph[u] = []
        graph[u].append([v, w])

    dist = [sys.maxsize for _ in range(n + 1)]
    dist[src] = 0

    needCheck = []
    while True:
        flag = False

        if graph.get(src) is not None:
            for v, w in graph[src]:
                newDist = dist[src] + w

                if newDist >= dist[v]:
                    continue

                dist[v] = newDist

                if v not in needCheck:
                    needCheck.append(v)
                    flag = True

        if len(needCheck) == 0:
            break

        if flag:
            needCheck.sort(key=lambda x: dist[x])

        src = needCheck.pop(0)

    return -1 if dist[tar] == sys.maxsize else dist[tar]


# 算法调用
print(getResult(n, times, src, dist))

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?