华为机试:最长广播效应
【编程题目 | 200分】最长广播效应 [ 200 / 中等 ]
题目描述
- 
 某通信网络中有N个网络结点,用1到N进行标识。 网络中的结点互联互通,且结点之间的消息传递有时延,相连结点的时延均为一个时间单位。 现给定网络结点的连接关系link[i]={u,v},其中u和v表示网络结点。 当指定一个结点向其他结点进行广播,所有被广播结点收到消息后都会在原路径上回复一条响应消息,请计算发送结点至少需要等待几个时间单位才能收到所有被广播结点的响应消息。
注:
- N的取值范围为[1,100];
- 连接关系link的长度不超过3000,且1 <= u,v <= N;
- 网络中任意结点间均是可达的;
输入描述
- 
 输入的第一行为两个正整数,分别表示网络结点的个数N,以及时延列表的长度T; 接下来的T行输入,表示结点间的连接关系列表; 最后一行的输入为一个正整数,表示指定的广播结点序号;
输出描述
输出一个整数,表示发送结点接收到所有响应消息至少需要等待的时长。
示例
输入
5 7 1 4 2 1 2 3 2 4 3 4 3 5 4 5 2
输出
4
说明
结点2到5的最小时延为2,到剩余结点的最小时延均为1,所以至少要等待2*2=4s。
思路分析
单源最短路径问题,找到起始点到其它节点的最短路径的最大值乘2即可。可以使用BFS、DFS或者dijkstra算法。
这里使用BFS算法实现。
参考代码
import java.util.*;
import java.util.Scanner;
public class longestBroadcast {
          
   
    public static void main(String[] args) {
          
   
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int T = in.nextInt();
        // 使用hashMap存储节点的连接关系
        HashMap<Integer, HashSet<Integer>> map = new HashMap<>();
        for (int i = 0; i < T; i++) {
          
   
            int start = in.nextInt();
            int end = in.nextInt();
            if (!map.containsKey(start)) {
          
   
                map.put(start, new HashSet<>());
            }
            if (!map.containsKey(end)) {
          
   
                map.put(end, new HashSet<>());
            }
            map.get(start).add(end);
            map.get(end).add(start);
        }
        int head = in.nextInt();
        Deque<Integer> queue = new LinkedList<>();
        queue.add(head);
        Set<Integer> visited = new HashSet<>();  // 判断是否已经访问过
        int[] d = new int[N + 1];  // 最短路径长度数组
        while (!queue.isEmpty()) {
          
   
            int poll = queue.pollFirst();
            for (int node : map.get(poll)) {
          
   
                if (!visited.contains(node)) {
          
   
                    visited.add(node);
                    d[node] = d[poll] + 1;
                    queue.add(node);
                }
            }
        }
        int res = 0; // 最大最短路径
        for (int i = 1; i < N + 1; i++) {
          
   
            res = Math.max(res, d[i]);
        }
        System.out.println(res * 2);
    }
} 
欢迎在评论区讨论指正,及留下自己的方法。

