Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- 스파르타코딩클럽 #크롤링 #스크래핑
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 항해99솔직후기 #항해99 #부트캠프추천
Archives
- Today
- Total
이모저모
플로이드 와샬 - 회장 뽑기 문제 본문
import sys
n = int(sys.stdin.readline().rstrip())
dy = [["M"]*n for _ in range(n)]
# 자신과의 거리는 0
for i in range(n):
dy[i][i] = 0
# 입력 라인이 -1 -1로 종료를 알릴 때까지 연결 정보를 받아온다.
while True:
i, j = map(int, sys.stdin.readline().split())
if i == -1 and j == -1:
break
dy[i-1][j-1] = 1
dy[j-1][i-1] = 1
# k 번째 친구를 경유하는 상황을 하나씩 추가해서 고려하면서, 최소 거리를 업데이트.
for k in range(n):
for i in range(n):
for j in range(n):
if dy[i][j] == "M":
if dy[i][k] != "M" and dy[k][j] != "M":
dy[i][j] = dy[i][k] + dy[k][j]
else:
continue
else:
if dy[i][k] != "M" and dy[k][j] != "M":
dy[i][j] = min(dy[i][j], dy[i][k] + dy[k][j])
else:
continue
# 각 행마다 자신의 최대 거리를 기록
each_max = []
for i in range(n):
each_max.append(max(dy[i]))
# 최대거리가 가장 적은 경우의 최대거리 -> 이는 곧 회장 후보의 점수
lowest = min(each_max)
# 회장 후보 점수를 가진 사람 수
count = 0
# 회장 후보 리스트
candidates = []
# 최저점을 가진 사람을 발견할 때마다 count 증가, 해당 인덱스에 1을 더해서 후보가 누구인지도 출력
for i, max in enumerate(each_max):
if max == lowest:
count += 1
candidates.append(str(i+1))
print(lowest, count)
print(" ".join(candidates))
'coding > 알고리즘,자료구조' 카테고리의 다른 글
다익스트라(Dijkstra) 최단경로 _이코테, 프로그래머스(가장 먼 노드) (0) | 2022.02.02 |
---|---|
위상정렬(topological sorting) (0) | 2022.02.02 |
플로이드-와샬 _ 그래프 최단거리 (0) | 2022.02.01 |
knapsack 연습 - 최대점수 구하기 (0) | 2022.02.01 |
knapsack 알고리즘 연습 - 주어진 금액을 최소 동전 개수로 교환 (0) | 2022.02.01 |
Comments