Tag: floyd warshall
All the articles with the tag "floyd warshall".
BOJ2458GOLD 4
from collections import defaultdict, deque
N, M = map(int, input().split())
taller = defaultdict(list)
shorter = defaultdict(list)
for _ in range(M):
a, b = map(int, input().split())
taller[a].append(b)
shorter[b].append(a)
def bfs(graph, start):
visited = set()
q = deque([start])
while q:
node = q.popleft()
for n in graph[node]:
if n not in visited:
visited.add(n)
q.append(n)
return visited
result = 0
for i in range(1, N+1):
visited_taller = bfs(taller, i)
visited_shorter = bfs(shorter, i)
# 앞 뒤의 키를 모두 탐색 가능할 경우
if len(visited_taller) + len(visited_shorter) == N - 1:
result += 1
print(result)키 순서
백준 2458번 '키 순서' (골드 4) 문제 풀이. graph theory, graph traversal, shortest path 로 접근했다.
BOJ1389SILVER 1
from collections import defaultdict, deque
INF = float('inf')
def floyd(n, dist_list):
for k in range(n):
for i in range(n):
for j in range(n):
dist_list[i][j] = min(dist_list[i][j], dist_list[i][k] + dist_list[k][j])
min_sum = INF
result = 0
for i, sum_dist in enumerate(map(sum, dist_list), start=1):
if min_sum > sum_dist:
min_sum = sum_dist
result = i
return result
def main():
N, M = map(int, input().split())
dist_list = [[INF] * N for _ in range(N)]
for i in range(0, N):
dist_list[i][i] = 0
for _ in range(M):
a, b = map(int, input().split())
a -= 1
b -= 1
dist_list[a][b] = 1
dist_list[b][a] = 1
print(floyd(N, dist_list))
if __name__ == "__main__":
main()케빈 베이컨의 6단계 법칙
백준 1389번 '케빈 베이컨의 6단계 법칙' (실버 1) 문제 풀이. graph theory, graph traversal, bfs 로 접근했다.
BOJ11404GOLD 4
INF = float("inf")
def floyd(n, dist_list):
"""플로이드 워셜"""
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
dist_list[i][j] = min(
dist_list[i][j], dist_list[i][k] + dist_list[k][j]
)
return dist_list
def print_result(dist_list):
"""결과 출력"""
for dist in dist_list[1:]:
for d in dist[1:]:
print(d if d != INF else 0, end=" ")
print()
def main():
n = int(input())
m = int(input())
dist_list = [[INF] * (n + 1) for _ in range(n + 1)]
for _ in range(m):
a, b, c = map(int, input().split())
dist_list[a][b] = min(dist_list[a][b], c)
for i in range(1, n + 1):
dist_list[i][i] = 0
dist_list = floyd(n, dist_list)
print_result(dist_list)
if __name__ == "__main__":
main()플로이드
백준 11404번 '플로이드' (골드 4) 문제 풀이. graph theory, shortest path, floyd warshall 로 접근했다.