首页 > 试题广场 >

分布式集群消息传递

[编程题]分布式集群消息传递
  • 热度指数:1023 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
有一个分布式服务集群,集群内含有 N 个服务节点,分别标记为 1 到 N。
给予一个列表 times,表示消息从两个节点间有向传递需要的时间。 times[i] = (s, d, t),其中 s 表示发出消息的源节点,d 表示接收到消息的目标节点, t  表示信息有向传递的时间。
现在 K 节点发送了一个信号,请问至少需要多少秒才能使所有的服务节点都收到该消息?如果消息不能传递给集群内全部节点,则返回-1。

输入描述:
第一行:列表 times。分布式服务集群的图,图的结构为二维数组。例如: [[2,1,1],[2,3,1],[3,4,1]] ,表示集群4个节点,2到1的时间为1,2到3的时间为1,3到4的时间为1;
第二行:N值
第三行:K值
范围约束:
1. N 的范围在 [1, 100] 之间。
2. K 的范围在 [1, N] 之间。
3. times 的长度在 [1, 6000] 之间。
4. 所有的边 times[i] = (s, d, t) 都有 1 <= s, d <= N 且 1 <= t <= 100。


输出描述:
至少需要多少秒才能使所有的服务节点都收到该消息?如果消息不能传递给集群内全部节点,则返回-1
示例1

输入

[[2,1,1],[2,3,1],[3,4,1]]
4
2

输出

2

备注:
图可能存在重边或自环
import java.util.*;

// Dijkstra:单源最短路径
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.next();
        int n = in.nextInt(), k = in.nextInt();
        List<List<int[]>> g = new ArrayList<>(); // 邻接表
        for (int i = 0; i <= n; i++) {
            g.add(new ArrayList<>());
        }
        line = line.substring(2, line.length() - 2); // 处理输入
        String[] sp = line.split("\\],\\["); // 去掉首尾[[ ]], 中间可以用],[分割
        for (String str : sp) {
            String[] spp =  str.split(",");
            int s = Integer.parseInt(spp[0]);
            int d = Integer.parseInt(spp[1]);
            int t = Integer.parseInt(spp[2]);
            g.get(s).add(new int[] {d, t}); // 有向图
            // g.get(d).add(new int[] {s, t});
        }

        int[] dist = new int[n + 1]; // k点到其他点的距离
        int INF = Integer.MAX_VALUE >> 1;
        Arrays.fill(dist, INF);
        dist[k] = 0;
        PriorityQueue<int[]> queue = new PriorityQueue<>((a, b)->a[1] - b[1]);
        queue.offer(new int[] {k, 0});
        while (!queue.isEmpty()) {
            int[] a = queue.poll();
            int s = a[0], dis = a[1];
            if (dis > dist[s]) continue;

            for (int[] b : g.get(s)) {
                int d = b[0], t = b[1];
                int newDis = dis + t;
                if (newDis < dist[d]) {
                    dist[d] = newDis;
                    b[1] = newDis;
                    queue.offer(b);
                }
            }
        }

        int max = -1;
        for (int i = 1; i <= n; i++) { // k到其他点的最长距离
            if (dist[i] == INF) {
                max = -1;
                break;
            }
            max = Math.max(dist[i], max);
        }
        System.out.println(max);
    }
}

发表于 2025-06-29 10:13:09 回复(0)