#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 987654321;
int d[20005];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int V, E, u, v, w;
cin >> V >> E;
for (int i = 1; i < V+1; i++) { // 전체 정점 거리 무한대 초기화
d[i] = INF;
}
int start;
cin >> start;
vector<pair<int, int>> adj[20005];
for (int i = 0; i < E; i++) { // 인접 리스트
cin >> u >> v >> w;
adj[u].push_back(make_pair(w, v));
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 최소 힙
// (정점까지의 거리, 정점 번호)를 저장하는 최소 힙을 선언한다.
d[start] = 0; // 시작 정점까지의 거리는 0이다.
pq.push(make_pair(d[start], start)); // 시작 거리 0 최소화후 최소힙 삽입
while(!pq.empty()) {
pair<int, int> cur = pq.top(); pq.pop();
if (d[cur.second] != cur.first) continue;
for (int i = 0; i < adj[cur.second].size(); i++) {
pair<int, int> next = adj[cur.second][i];
if (d[next.second] <= d[cur.second] + next.first) continue;
d[next.second] = d[cur.second] + next.first;
pq.push(make_pair(d[next.second], next.second));
}
}
for (int i = 1; i < V+1; i++) {
if (d[i] == INF) cout << "INF\n";
else cout << d[i] << '\n';
}
return 0;
}
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
이 문제의 정답이기도 하다.
class Solution:
def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
graph = collections.defaultdict(list)
for u, v, w in times:
graph[u].append((v, w))
Q = [(0, k)] # 시작점과 시작 거리
dist = collections.defaultdict(int)
while Q:
time, node = heapq.heappop(Q)
if node not in dist: # 거리 저장이 안되어있으면
dist[node] = time # 거리 저장
for v, w in graph[node]:
temp = time + w
heapq.heappush(Q, (temp, v))
if len(dist) == n:
return max(dist.values())
return -1
https://leetcode.com/problems/network-delay-time/
Network Delay Time - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
이 문제의 정답이기도 하다.
출처
https://blog.encrypted.gg/941?category=773649
[실전 알고리즘] 0x09강 - BFS
안녕하세요 여러분, 드디어 올 것이 왔습니다. 마음의 준비를 단단히 하셔야 합니다.. 드디어 실전 알고리즘 강의에서 첫 번째 고비에 도달했는데 이 강의와 함께 이번 고비를 잘 헤쳐나가면 좋
blog.encrypted.gg
파이썬 알고리즘 인터뷰 : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com
'Algorithm > 이론' 카테고리의 다른 글
트라이 (0) | 2022.09.13 |
---|---|
배열로 Heap 구현 예시 (0) | 2022.09.11 |
배열 3개로 연결리스트 흉내내기 (0) | 2022.07.22 |
BFS 예시 코드 [C++, Python] (0) | 2022.07.09 |
재귀로 조합 구현하기 [C++} (0) | 2022.07.08 |