Skip to content

Commit 09db868

Browse files
committed
shortest path : floyd-warshall, dijkstra, bellman-ford
1 parent 17ce4dc commit 09db868

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313

1414
## Graph
1515

16+
### Shotest Path
17+
18+
- [Floyd-Warshall](/graph/shortest_path/floyd_warshall.py)
19+
- [BOJ 11404 : 플로이드](https://www.acmicpc.net/problem/11404)
20+
- [Dijkstra](graph/shortest_path/dijkstra.py)
21+
- [BOJ 1753 : 최단경로](https://www.acmicpc.net/problem/1753)
22+
- [Bellman-Ford](/graph/shortest_path/bellman_ford.py)
23+
- [BOJ 11657 : 타임머신](https://www.acmicpc.net/problem/11657)
24+
1625
## String
1726

1827
- [KMP](/string/kmp.py)

graph/shortest_path/bellman_ford.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# [BOJ 11657] 타임머신
2+
# link : https://www.acmicpc.net/problem/11657
3+
# tag : graph, bellman-ford, shortest path, negative cycle
4+
# @subinium
5+
6+
# Bellman-Ford Algorthm
7+
def bellman_ford(v, edge, start=1):
8+
INF = 1e10
9+
dist = [INF for _ in range(v+1)]
10+
dist[start] = 0
11+
for i in range(1, v+1):
12+
for st, ed, val in edge: # start, end, value
13+
if dist[st] == INF: continue
14+
if dist[ed] > dist[st] + val:
15+
dist[ed] = dist[st] + val
16+
if i == v : return None, True
17+
return dist, False
18+
19+
# Main
20+
if __name__ == '__main__':
21+
N, M = map(int, input().split())
22+
edge = [tuple(map(int, input().split())) for _ in range(M)] # (from, to, time)
23+
dist, neg = bellman_ford(N, edge)
24+
if neg : print(-1) # Negative Cycle
25+
else : print('\n'.join(map(str, [i if i!=1e10 else -1 for i in dist[2:]])))

graph/shortest_path/dijkstra.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [BOJ 1753] 최단경로
2+
# link : https://www.acmicpc.net/problem/1753
3+
# tag : graph, dijkstra, shortest path
4+
# @subinium
5+
6+
import sys
7+
from heapq import heappop, heappush
8+
9+
# Dijkstra Algorithm
10+
def dijkstra(v, start, edge_raw):
11+
INF = 1e10
12+
edge = [[] for _ in range(v+1)]
13+
# Adjacency list
14+
for st, ed, val in edge_raw: edge[st].append((val, ed))
15+
dist = [INF for _ in range(v+1)]
16+
dist[start] = 0
17+
hq = [(0, start)]
18+
while len(hq):
19+
val, st = heappop(hq)
20+
if dist[st] < val : continue
21+
for val_edge, ed in edge[st]:
22+
if dist[ed] > dist[st] + val_edge:
23+
dist[ed] = dist[st] + val_edge
24+
heappush(hq, (dist[ed], ed))
25+
return dist
26+
27+
# Main
28+
if __name__ == '__main__':
29+
input = sys.stdin.readline # fastio
30+
V, E = map(int, input().split())
31+
K = int(input())
32+
edge = [tuple(map(int, input().split())) for _ in range(E)]
33+
dist = dijkstra(V, K, edge)
34+
print('\n'.join([str(i) if i!=1e10 else 'INF' for i in dist[1:]]))

graph/shortest_path/floyd_warshall.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# [BOJ 11404] 플로이드
2+
# link : https://www.acmicpc.net/problem/11657
3+
# tag : graph, floyd-warshall, shortest path
4+
# @subinium
5+
6+
# Floyd-Warshall Algorthm
7+
# time complexity : O(V^3)
8+
def floyd_warshall(v, edge):
9+
INF = 1e10
10+
dist = [[INF for _ in range(v+1)] for _ in range(v+1)]
11+
for st, ed, val in edge :
12+
dist[st][ed] = min(dist[st][ed], val)
13+
14+
# mid(중간), st(출발), ed(도착) 순서 중요
15+
for mid in range(1, v):
16+
for st in range(1, v+1):
17+
for ed in range(1, v+1):
18+
dist[st][ed] = min(dist[st][ed], dist[st][mid]+dist[mid][ed])
19+
20+
# 자기자신으로 가는 루트
21+
for i in range(v+1): dist[i][i] = INF
22+
return dist
23+
24+
# Main
25+
if __name__ == '__main__':
26+
n, m = int(input()), int(input())
27+
edge = [tuple(map(int, input().split())) for _ in range(m)] # (from, to, time)
28+
dist = floyd_warshall(n, edge)
29+
30+
for row in dist[1:]:
31+
print(' '.join([str(int(i * (i!=1e10))) for i in row[1:]]))

0 commit comments

Comments
 (0)