迅雷笔试 迅雷笔试题 迅雷秋招 0917
笔试时间:2025年9月17日
往年笔试合集:
第一题
在P2P网络传输中,节点的处理能力和链路的可用带宽直接影响数据传输的可行性。每个节点有最大可用带宽,每条链路有剩余带宽和传输延迟。当需要传输大小为D的数据包时,路径上的"所有节点"必须满足剩余带宽≥D,且路径上的"所有链路"剩余带宽也≥D。请设计算法,找到满足条件的最小总延迟路径。输出满足条件的最小总延迟。若不存在合法路径,输出-1。
输入描述
输出描述
输出满足条件的最小总延迟。若不存在合法路径,输出-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
可能的路径:
- 0→2→3: 总延迟=3+5=8
- 0→1→2→3: 总延迟=2+1+5=8
参考题解
解题思路:
- 过滤图结构:根据数据传输量d的要求,对原始的图进行筛选,只保留节点可用带宽和链路剩余带宽都大于等于d的部分
- 最短路径搜索:在筛选后的新图上,使用Dijkstra算法寻找从源节点s到目标节点t的延迟最小的路径
- 返回结果:如果能找到路径,返回最小总延迟;否则返回-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等多种语言做法集合指南