반응형
내간 푼 방식은 BFS였다.
아직 플로이드에 대한 숙련도가 부족해서인지 떠올리지도 못했다
BFS로 떠올릴 수 있었던 것은 양방향 그래프성질에서
가장 최소값들의 합인 번호를 찾아야했기에,
최소 이동으로 값을 구할려다 보니 자연스럽게 BFS가 떠올랐다.
from collections import deque
import sys
input = sys.stdin.readline
nodes,edges = map(int,input().split())
graph = [[]for i in range(nodes+1)] #그래프에 양방향 그래프 저장
for i in range(edges):
fst,scd = map(int,input().split())
graph[fst].append(scd)
graph[scd].append(fst)
rst = [1e9,0] #최솟값을 추려내기 위한 기준값 설정
for i in range(1,nodes+1):
tmp = 0 #임시 저장 값
for j in range(1,nodes+1):
visit = [0 for i in range(nodes+1)] #중복값 방문 방지
stg = deque() #BFS를 위해
stg.append((i,j,0)) #시작값 설정
visit[i] = 1
while stg:
cur = stg.popleft()
if cur[0]==cur[1]: #목적지에 도달했을 때
tmp +=cur[2] #이동거리 값 추가
break
for next in graph[cur[0]]:
if not visit[next]:
visit[next] = 1
stg.append((next,cur[1],cur[2]+1)) #다음 그래프로 이동
if tmp<rst[0]: #합산한 임시 값이 기준보다 작을 시
rst[0] = tmp #기준점 갱신
rst[1] = i #갱신한 노드 저장
print(rst[1]) #노드 출력
찾아보니 플로이드로 푼 사람 풀이도 있었다
https://www.acmicpc.net/source/54648470
로그인
www.acmicpc.net
tjddn929님의 풀이
더보기
n, m =map(int, input().split())
arr = [[987654321 for j in range(n + 1)] for i in range(n + 1)]
for i in range(1, n + 1):
arr[i][i] = 0
for i in range(m):
u ,v = map(int, input().split())
arr[u][v] = 1
arr[v][u] = 1
for k in range(n + 1):
for i in range(n + 1):
for j in range(n + 1):
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]) #플로이드 개념
total = 987654321
idx = -1
for i in range(1, n + 1):
#print(sum(arr[i][1:]))
if sum(arr[i][1:]) < total: #각 노드별로 모든 이동거리 합
total = sum(arr[i][1:])
idx = i
print(idx)
반응형
'알고리즘 문제들 으악 > 백준' 카테고리의 다른 글
| [python]3273번 두 수의 합, 투 포인터 알고리즘 (0) | 2023.01.29 |
|---|---|
| [python]5525번 IOIOI, IF지옥 (0) | 2023.01.28 |
| [python]🔥🔥🔥11066번 파일합치기, 그저 어렵다 (0) | 2023.01.25 |
| [python]11727번 2×n 타일링 2 (0) | 2023.01.25 |
| [python]7662번 이중 우선순위 큐 (0) | 2023.01.22 |