题目描述
某通信网络中有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