迅雷笔试 迅雷笔试题 迅雷秋招 0917

笔试时间:2025年9月17日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

在P2P网络传输中,节点的处理能力和链路的可用带宽直接影响数据传输的可行性。每个节点有最大可用带宽,每条链路有剩余带宽和传输延迟。当需要传输大小为D的数据包时,路径上的"所有节点"必须满足剩余带宽≥D,且路径上的"所有链路"剩余带宽也≥D。请设计算法,找到满足条件的最小总延迟路径。输出满足条件的最小总延迟。若不存在合法路径,输出-1。

输入描述

  • n: 节点数(节点编号从0开始)
  • s: 源节点
  • t: 目标节点
  • node_bandwidths: 节点i的可用带宽
  • edges: 每条边的属性为(起点)、(终点)、(链路剩余带宽)、(传输延迟)
  • d: 需传输的数据量
  • 输出描述

    输出满足条件的最小总延迟。若不存在合法路径,输出-1。

    样例输入

    4,0,3,[10,5,8,7],[[0,1,4,2],[0,2,5,3],[1,2,3,1],[1,3,2,5],[2,3,4,5]],3

    样例输出

    8

    样例说明1

    所有节点的带宽都需要≥3:

    • 节点0: 10≥3 ✓
    • 节点1: 5≥3 ✓
    • 节点2: 8≥3 ✓
    • 节点3: 7≥3 ✓

    链路带宽都需要≥3:

    • [0,1,4,2]: 带宽4≥3 ✓, 延迟2
    • [0,2,5,3]: 带宽5≥3 ✓, 延迟3
    • [1,2,3,1]: 带宽3≥3 ✓, 延迟1
    • [1,3,2,5]: 带宽2<3 ✗, 不满足约束
    • [2,3,4,5]: 带宽4≥3 ✓, 延迟5

    可能的路径:

    1. 0→2→3: 总延迟=3+5=8
    2. 0→1→2→3: 总延迟=2+1+5=8

    参考题解

    解题思路:

    1. 过滤图结构:根据数据传输量d的要求,对原始的图进行筛选,只保留节点可用带宽和链路剩余带宽都大于等于d的部分
    2. 最短路径搜索:在筛选后的新图上,使用Dijkstra算法寻找从源节点s到目标节点t的延迟最小的路径
    3. 返回结果:如果能找到路径,返回最小总延迟;否则返回-1

    C++:

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <climits>
    using namespace std;
    
    class Solution {
    public:
        int find_min_delay_path(int n, int s, int t, vector<int>& node_bandwidths, 
                               vector<vector<int>>& edges, int d) {
            if (node_bandwidths[s] < d || node_bandwidths[t] < d) {
                return -1;
            }
            
            vector<vector<pair<int, int>>> adj(n);
            
            for (auto& edge : edges) {
                int u = edge[0];
                int v = edge[1];
                int bandwidth = edge[2];
                int delay = edge[3];
                
                if (node_bandwidths[u] >= d && node_bandwidths[v] >= d && bandwidth >= d) {
                    adj[u].push_back({v, delay});
                }
            }
            
            vector<int> dist(n, INT_MAX);
            dist[s] = 0;
            
            priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
            pq.push({0, s});
            
            while (!pq.empty()) {
                auto [currentDelay, u] = pq.top();
                pq.pop();
                
                if (currentDelay > dist[u]) {
                    continue;
                }
                
                if (u == t) {
                    return dist[t];
                }
                
                for (auto& [v, delay] : adj[u]) {
                    if (dist[u] + delay < dist[v]) {
                        dist[v] = dist[u] + delay;
                        pq.push({dist[v], v});
                    }
                }
            }
            
            return dist[t] == INT_MAX ? -1 : dist[t];
        }
    };
    

    Java:

    import java.util.*;
    
    public class Solution {
        public int find_min_delay_path(int n, int s, int t, int[] node_bandwidths, 
                                      int[][] edges, int d) {
            if (node_bandwidths[s] < d || node_bandwidths[t] < d) {
                return -1;
            }
            
            List<int[]>[] adj = new ArrayList[n];
            for (int i = 0; i < n; i++) {
                adj[i] = new ArrayList<>();
            }
            
            for (int[] edge : edges) {
                int u = edge[0];
                int v = edge[1];
                int bandwidth = edge[2];
                int delay = edge[3];
                
                if (node_bandwidths[u] >= d && node_bandwidths[v] >= d && bandwidth >= d) {
                    adj[u].add(new int[]{v, delay});
                }
            }
            
            int[] dist = new int[n];
            Arrays.fill(dist, Integer.MAX_VALUE);
            dist[s] = 0;
            
            PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
            pq.offer(new int[]{s, 0});
            
            while (!pq.isEmpty()) {
                int[] current = pq.poll();
                int u = current[0];
                int currentDelay = current[1];
                
                if (currentDelay > dist[u]) {
                    continue;
                }
                
                if (u == t) {
                    return dist[t];
                }
                
                for (int[] neighbor : adj[u]) {
                    int v = neighbor[0];
                    int delay = neighbor[1];
                    
                    if (dist[u] + delay < dist[v]) {
                        dist[v] = dist[u] + delay;
                        pq.offer(new int[]{v, dist[v]});
                    }
                }
            }
            
            return dist[t] == Integer.MAX_VALUE ? -1 : dist[t];
        }
    }
    

    Python:

    import heapq
    
    class Solution:
        def find_min_delay_path(self, n, s, t, node_bandwidths, edges, d):
            if node_bandwidths[s] < d or node_bandwidths[t] < d:
                return -1
            
            adj = [[] for _ in range(n)]
            
            for edge in edges:
                u, v, bandwidth, delay = edge
                
                if node_bandwidths[u] >= d and node_bandwidths[v] >= d and bandwidth >= d:
                    adj[u].append((v, delay))
            
            dist = [float('inf')] * n
            dist[s] = 0
            
            pq = [(0, s)]
            
            while pq:
                current_delay, u = heapq.heappop(pq)
                
                if current_delay > dist[u]:
     

    剩余60%内容,订阅专栏后可继续查看/也可单篇购买

    2025 春招笔试合集 文章被收录于专栏

    2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

    全部评论

    相关推荐

    牛客吹哨人:哨哥晚点统一更新到黑名单:能救一个是一个!26届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1525833
    点赞 评论 收藏
    分享
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务