There is a network of n
servers, labeled from 0
to n - 1
. You are given a 2D integer array edges
, where edges[i] = [ui, vi]
indicates there is a message channel between servers ui
and vi
, and they can pass any number of messages to each other directly in one second. You are also given a 0-indexed integer array patience
of length n
.
All servers are connected, i.e., a message can be passed from one server to any other server(s) directly or indirectly through the message channels.
The server labeled 0
is the master server. The rest are data servers. Each data server needs to send its message to the master server for processing and wait for a reply. Messages move between servers optimally, so every message takes the least amount of time to arrive at the master server. The master server will process all newly arrived messages instantly and send a reply to the originating server via the reversed path the message had gone through.
At the beginning of second 0
, each data server sends its message to be processed. Starting from second 1
, at the beginning of every second, each data server will check if it has received a reply to the message it sent (including any newly arrived replies) from the master server:
i
will resend the message every patience[i]
second(s), i.e., the data server i
will resend the message if patience[i]
second(s) have elapsed since the last time the message was sent from this server.The network becomes idle when there are no messages passing between servers or arriving at servers.
Return the earliest second starting from which the network becomes idle.
Example 1:
Input: edges = [[0,1],[1,2]], patience = [0,2,1] Output: 8 Explanation: At (the beginning of) second 0, - Data server 1 sends its message (denoted 1A) to the master server. - Data server 2 sends its message (denoted 2A) to the master server. At second 1, - Message 1A arrives at the master server. Master server processes message 1A instantly and sends a reply 1A back. - Server 1 has not received any reply. 1 second (1 < patience[1] = 2) elapsed since this server has sent the message, therefore it does not resend the message. - Server 2 has not received any reply. 1 second (1 == patience[2] = 1) elapsed since this server has sent the message, therefore it resends the message (denoted 2B). At second 2, - The reply 1A arrives at server 1. No more resending will occur from server 1. - Message 2A arrives at the master server. Master server processes message 2A instantly and sends a reply 2A back. - Server 2 resends the message (denoted 2C). ... At second 4, - The reply 2A arrives at server 2. No more resending will occur from server 2. ... At second 7, reply 2D arrives at server 2. Starting from the beginning of the second 8, there are no messages passing between servers or arriving at servers. This is the time when the network becomes idle.
Example 2:
Input: edges = [[0,1],[0,2],[1,2]], patience = [0,10,10] Output: 3 Explanation: Data servers 1 and 2 receive a reply back at the beginning of second 2. From the beginning of the second 3, the network becomes idle.
Constraints:
n == patience.length
2 <= n <= 105
patience[0] == 0
1 <= patience[i] <= 105
for 1 <= i < n
1 <= edges.length <= min(105, n * (n - 1) / 2)
edges[i].length == 2
0 <= ui, vi < n
ui != vi
This problem involves finding the earliest time when a network of servers becomes idle after processing messages. The network consists of a master server (server 0) and several data servers. Each data server sends a message to the master server, which processes it and sends a reply. Data servers resend their messages periodically if they haven't received a reply within their patience time. The network is idle when no messages are in transit or arriving.
The solution uses Breadth-First Search (BFS) to efficiently determine the shortest paths from each data server to the master server. This shortest path determines the time it takes for a message to reach the master server and return.
Algorithm:
Graph Construction: Build an adjacency list representation of the network using the edges
array. This allows for easy traversal using BFS.
BFS Traversal: Perform a BFS starting from the master server (node 0). During the traversal:
d
) from each server to the master server. The distance represents the time it takes for a message to reach the master.Calculating Idle Time: For each data server (i
):
2 * d[i]
.(2 * d[i] -1 ) / patience[i] * patience[i]
. This ensures we get the last multiple of patience time before the reply arrives.(2 * d[i] -1 ) / patience[i] * patience[i] + 2 * d[i]
.+ 1
accounts for the instant processing at the master server before the reply is sent.Time Complexity: The BFS traversal takes O(V + E) time, where V is the number of vertices (servers) and E is the number of edges. The subsequent calculation of idle time for each data server takes O(V) time. Therefore, the overall time complexity is O(V + E), which is linear in the size of the network.
Space Complexity: The space complexity is dominated by the adjacency list (O(V + E)) and the vis
array (O(V)), and the queue used in BFS (at most O(V)). Thus, the overall space complexity is O(V + E).
Code Implementation (Python):
from collections import defaultdict, deque
class Solution:
def networkBecomesIdle(self, edges: List[List[int]], patience: List[int]) -> int:
n = len(patience)
graph = defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
distances = [-1] * n
distances[0] = 0
queue = deque([0])
while queue:
u = queue.popleft()
for v in graph[u]:
if distances[v] == -1:
distances[v] = distances[u] + 1
queue.append(v)
max_idle_time = 0
for i in range(1, n):
round_trip_time = 2 * distances[i]
last_send_time = (round_trip_time - 1) // patience[i] * patience[i]
max_idle_time = max(max_idle_time, last_send_time + round_trip_time + 1)
return max_idle_time
The code in other languages (Java, C++, Go, TypeScript) follows a similar structure, adapting the data structures and syntax to the respective languages. The core algorithm remains the same.