spring-comes-to-us / algorithm-comes-to-us

알고리즘 스터디!
0 stars 0 forks source link

[Leetcode] 743. Network Delay Time #43

Closed uijin-j closed 8 months ago

uijin-j commented 9 months ago

문제 링크

스크린샷 2024-01-05 23 53 36
ASak1104 commented 9 months ago

743. Network Delay Time

Java 풀이

```java import java.util.Arrays; class Solution { static final int MAX = (int) 1e9; static int[][] dists; public int networkDelayTime(int[][] times, int n, int k) { dists = new int[n + 1][n + 1]; for (int u = 1; u <= n; u++) { Arrays.fill(dists[u], MAX); dists[u][0] = 0; dists[u][u] = 0; } for (int[] time : times) { dists[time[0]][time[1]] = time[2]; } floydWarshall(n); return getDelayTime(k); } void floydWarshall(int n) { for (int k = 1; k <= n; k++) { for (int u = 1; u <= n; u++) { for (int v = 1; v <= n; v++) { dists[u][v] = Math.min(dists[u][v], dists[u][k] + dists[k][v]); } } } } int getDelayTime(int k) { int max = -1; for (int w : dists[k]) { if (w == MAX) { return -1; } max = Math.max(max, w); } return max; } } ```

Kotlin 풀이

```kt import java.util.* const val MAX = 1e9.toInt() class Solution { lateinit var edges: Array> fun networkDelayTime(times: Array, n: Int, k: Int): Int { edges = Array(n) { arrayListOf() } for ((u, v, w) in times) { edges[u - 1] += Edge(v - 1, w) } return dijkstra(k - 1) } fun dijkstra(start: Int): Int { val dists: Array = Array(edges.size) { MAX } val pq = PriorityQueue(compareBy(Edge::w)) pq += Edge(start, 0) dists[start] = 0 while (pq.isNotEmpty()) { val (u, cost) = pq.poll() if (cost > dists[u]) { continue } for ((v, w) in edges[u]) { if (dists[v] <= cost + w) { continue } pq += Edge(v, cost + w) dists[v] = cost + w } } if (MAX in dists) { return -1 } return dists.max() } data class Edge(val node: Int, val w: Int) } ```

코멘트

yenzip commented 9 months ago

743. Network Delay Time

C++ 코드 풀이

```c++ class Solution { public: vector>> graph; vector dist; void dijkstra(int s) { priority_queue> pq; dist[s] = 0; pq.push({0, s}); while (!pq.empty()) { int now = pq.top().second; int weight = -pq.top().first; pq.pop(); if (dist[now] < weight) { continue; } for (auto next : graph[now]) { int cost = weight + next.second; if (cost < dist[next.first]) { dist[next.first] = cost; pq.push({-cost, next.first}); } } } } int networkDelayTime(vector>& times, int n, int k) { int answer = 0; graph.resize(n + 1); dist.resize(n + 1, INT_MAX); for (auto time : times) { graph[time[0]].push_back({time[1], time[2]}); } dijkstra(k); for (int i = 1; i <= n; i++) { answer = max(answer, dist[i]); } return answer == INT_MAX ? -1 : answer; } }; ```

코멘트

uijin-j commented 9 months ago

743. Network Delay Time

코드 풀이

```java class Solution { private final int INF = 987654321; private class Node { int to, time; Node(int to, int time) { this.to = to; this.time = time; } } public int networkDelayTime(int[][] times, int n, int k) { int[][] dist = new int[n+1][n+1]; int[] min = new int[n+1]; boolean[] check = new boolean[n+1]; for (int i = 0; i <= n; i++) Arrays.fill(dist[i], INF); Arrays.fill(min, INF); min[k] = 0; for(int[] time: times) { int u = time[0]; int v = time[1]; int t = time[2]; dist[u][v] = t; } Queue pq = new PriorityQueue<>((a, b) -> a.time - b.time); pq.add(new Node(k, 0)); while(!pq.isEmpty()) { Node node = pq.poll(); if(check[node.to]) continue; check[node.to] = true; // 최단거리 확정 for(int i = 1; i <= n; ++i) { if(dist[node.to][i] == INF) continue; if(min[node.to] + dist[node.to][i] < min[i]) { min[i] = min[node.to] + dist[node.to][i]; pq.offer(new Node(i, min[i])); } } } int max = 0; for(int i = 1; i <= n; ++i) { max = Math.max(min[i], max); } return max == INF ? -1 : max; } } ```

코멘트

shoeone96 commented 8 months ago

743. Network Delay Time

코드 풀이

```java class Solution { static class Edge{ int to; int weight; public Edge(int to, int weight){ this.to = to; this.weight = weight; } } static class Info{ int to; int distance; public Info(int to, int distance){ this.to = to; this.distance = distance; } } public int networkDelayTime(int[][] times, int n, int k) { List [] edges = new ArrayList [n+1]; int[] distance = new int[n + 1]; for(int i = 1; i <= n; i++){ distance[i] = Integer.MAX_VALUE; } for(int i = 1; i <=n; i++){ edges[i] = new ArrayList<>(); } for(int i = 0; i < times.length; i++){ int from = times[i][0]; int to = times[i][1]; int weight = times[i][2]; edges[from].add(new Edge(to, weight)); } PriorityQueue infos = new PriorityQueue<>(Comparator.comparing(info -> info.distance)); infos.add(new Info(k, 0)); distance[k] = 0; while(!infos.isEmpty()){ Info info = infos.poll(); if(info.distance != distance[info.to]) continue; for(Edge e : edges[info.to]){ if(distance[info.to] + e.weight >= distance[e.to]) continue; distance[e.to] = distance[info.to] + e.weight; infos.add(new Info(e.to, distance[e.to])); } } int answer = 0; for(int i = 1; i <=n; i++){ if(distance[i] == Integer.MAX_VALUE) return -1; if(answer < distance[i]) answer = distance[i]; } return answer; } } ```

코멘트

Sehee-Lee-01 commented 8 months ago

743. Network Delay Time

코드 풀이

```java class Solution { static class Edge { int num; int dis; Edge(int num, int dis) { this.num = num; this.dis = dis; } } public int networkDelayTime(int[][] times, int n, int k) { int[] dis = new int[n + 1]; List[] edges = new ArrayList[n + 1]; for (int i = 1; i <= n; i++) { dis[i] = -1; edges[i] = new ArrayList<>(); } for (int[] time : times) { edges[time[0]].add(new Edge(time[1], time[2])); } PriorityQueue pq = new PriorityQueue<>((a, b) -> a.dis - b.dis); pq.add(new Edge(k, 0)); dis[k] = 0; while (!pq.isEmpty()) { Edge curr = pq.poll(); for (Edge edge : edges[curr.num]) { if (dis[edge.num] == -1 || (dis[edge.num] > dis[curr.num] + edge.dis)) { dis[edge.num] = dis[curr.num] + edge.dis; pq.add(edge); } } } int res = 0; boolean isImpossible = false; for (int minDis : dis) { if (minDis == -1) { isImpossible = true; break; } if (minDis > res) res = minDis; } return isImpossible ? -1 : res; } } ```

코멘트

IjjS commented 8 months ago

743. Network Delay Time

코드 풀이

```java // 코드 작성 class Solution { public int networkDelayTime(int[][] times, int n, int k) { Map> graph = new HashMap<>(); for (int[] time : times) { graph.putIfAbsent(time[0], new HashMap<>()); graph.get(time[0]).put(time[1], time[2]); } Queue pq = new PriorityQueue<>((arr1, arr2) -> arr1[1] - arr2[1]); pq.add(new int[] {k, 0}); Map dist = new HashMap<>(); while (!pq.isEmpty()) { int[] curr = pq.poll(); int node = curr[0]; int cost = curr[1]; if (!dist.containsKey(node)) { dist.put(node, cost); if (graph.containsKey(node)) { for (int next : graph.get(node).keySet()) { int alt = cost + graph.get(node).get(next); pq.add(new int[] {next, alt}); } } } } if (dist.size() == n) { return Collections.max(dist.values()); } return -1; } } ```

코멘트