diff --git "a/_WeeklyChallenges/W28-[Graph-Dijkstra]/Assignment_BOJ_1753_\354\265\234\353\213\250\352\262\275\353\241\234.py" "b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Assignment_BOJ_1753_\354\265\234\353\213\250\352\262\275\353\241\234.py" new file mode 100644 index 0000000..4c78c6f --- /dev/null +++ "b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Assignment_BOJ_1753_\354\265\234\353\213\250\352\262\275\353\241\234.py" @@ -0,0 +1,40 @@ +""" +BOJ #1753. 최단경로 (골드4) +https://www.acmicpc.net/problem/1753 +유형: Dijkstra , Graph +""" +import sys +import heapq +input = sys.stdin.readline +INF = 1e12 +V , E = map(int, input().split()) +start = int(input()) + +graph = [[] for _ in range(V+1)] +for _ in range(E) : + a,b , c =map(int, input().split()) + graph[a].append((b,c)) + +distance = [INF]*(V+1) +# 다익스트라 함수 +def dijkstra(start) : + q = [] + distance[start]=0 + heapq.heappush(q,(0,start)) + while q : + # 2.경유지 뽑기 + dist , now = heapq.heappop(q) + # 3-1. 이미 처리한 경유지인 경우 -> 무시 + if distance[now] < dist : + continue + #3-2. 현재 경유지에서 바로 갈 수 있는 노드 처리 + for t in graph[now]: + cost = dist + t[1] # 경유지를 거친 start - t[0] 의 거리 + if cost < distance[t[0]] : # 경유지 cost 가 더 작으면 업데이트 + distance[t[0]] = cost + heapq.heappush(q, (cost , t[0])) +#4. 출력 +dijkstra(start) +for node in range(1 , V+1) : + print("INF"if distance[node] >= INF else distance[node] ) + diff --git a/_WeeklyChallenges/W28-[Graph-Dijkstra]/README.md b/_WeeklyChallenges/W28-[Graph-Dijkstra]/README.md new file mode 100644 index 0000000..84a096e --- /dev/null +++ b/_WeeklyChallenges/W28-[Graph-Dijkstra]/README.md @@ -0,0 +1,16 @@ +## 🚀6월 4주차 (6/23) 스터디 발제 주제: Dijkstra +> 발제자: 김홍주 (zaqquum) + +> [!NOTE] +> 주제: Dijkstra + +### 🗂️ 스터디 자료 +- PDF: [바로가기 +](Study_BOJ_1504.pdf) + +### 📖 문제 +- [백준 #1504. 특정한 최단경로](https://www.acmicpc.net/problem/1504): Dijkstra / 골드 4 +- 정답 코드: [Study_BOJ_1504_특정한최단경로.py](Study_BOJ_1504_특정한최단경로.py) +### 💻 과제 +- [백준 #1753. 최단경로](https://www.acmicpc.net/problem/1753): Dijkstra / 골드4 +- 정답 코드: [Assignment_BOJ_1753_최단경로.py](Assignment_BOJ_1753_최단경로.py) diff --git a/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504.pdf b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504.pdf new file mode 100644 index 0000000..3d775d0 Binary files /dev/null and b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504.pdf differ diff --git "a/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504_\355\212\271\354\240\225\355\225\234\354\265\234\353\213\250\352\262\275\353\241\234.py" "b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504_\355\212\271\354\240\225\355\225\234\354\265\234\353\213\250\352\262\275\353\241\234.py" new file mode 100644 index 0000000..fc32152 --- /dev/null +++ "b/_WeeklyChallenges/W28-[Graph-Dijkstra]/Study_BOJ_1504_\355\212\271\354\240\225\355\225\234\354\265\234\353\213\250\352\262\275\353\241\234.py" @@ -0,0 +1,61 @@ +""" +BOJ #1504. 특정한 최단경로 (골드4) +https://www.acmicpc.net/problem/1504 +유형: Dijkstra , Graph +""" +import sys +import heapq +from collections import deque + +INF = 1e9 +input = sys.stdin.readline +answer = -1 +# 0. 입력 변수 +N ,E = map(int, input().split()) +graph =[[] for _ in range(N+1)] #인접리스트 초기화 +for i in range(E) : + a, b , cost = map(int, input().split()) + graph[a].append([b , cost ]) ; graph[b].append([a, cost]) +v1 ,v2 = map(int, input().split()) + +#1. 다익스트라 초기 설정 - 시작점 +start =1 ; target = N + +#2. 다익스트라 함수 정의 +def dikstra(start) : + # 최단 거리 테이블 초기화 + distance =[INF]*(N+1) + q = [] + heapq.heappush(q, (0,start)) + distance[start] = 0 + #[2] 경유지 선택 + while q : + dist , now = heapq.heappop(q) + #3-1 현재 노드가 이미 업데이트 완료되면 무시 + if distance[now] N 의 최단 거리 고르기 +s_distance = dikstra(start) +e_distance = dikstra(target) # 양방향 +s_v1 = s_distance[v1] +s_v2 = s_distance[v2] +v1_e = e_distance[v1] +v2_e = e_distance[v2] +v1_v2 = dikstra(v1)[v2] # v1 - v2 거리(공통) + +answer =min(s_v1 + v2_e , s_v2+v1_e ) + v1_v2 +if answer >= INF : + print(-1) +else : + print(answer) + +