스터디/알고리즘
케빈 베이컨의 6단계 법칙
세졍
2024. 3. 21. 21:56
내논리로 2가 나와야하는데 아무리해도 4가나옴/....
def dfs(start,end):
visited = [0]*(N+1)
visited[start] = 1
stack = [start]
cnt = 0
while stack:
t = stack[-1]
if t == end:
return cnt
for i in adj[t]:
if visited[i] == 0:
stack.append(i)
visited[i] = 1
cnt += 1
break
else:
stack.pop()
N, M = map(int,input().split())
adj = [[] for _ in range(N+1)]
for _ in range(M):
f1,f2 = map(int,input().split())
adj[f1].append(f2)
adj[f2].append(f1)
print(dfs(1,2))
bfs로하니까 바로 2나옴 => 최단거리는 bfs가 답
def bfs(start,end):
visited = [0]*(N+1)
queue = [start]
while queue:
t = queue.pop(0)
if t == end:
return visited[t]
for i in adj[t]:
if visited[i] == 0:
queue.append(i)
visited[i] = visited[t] + 1
N, M = map(int,input().split())
adj = [[] for _ in range(N+1)]
for _ in range(M):
f1,f2 = map(int,input().split())
adj[f1].append(f2)
adj[f2].append(f1)
print(bfs(1,2))
이게 해결되니 문제는 금방풀림..
def bfs(start,end):
visited = [0]*(N+1)
queue = [start]
while queue:
t = queue.pop(0)
if t == end:
return visited[t]
for i in adj[t]:
if visited[i] == 0:
queue.append(i)
visited[i] = visited[t] + 1
N, M = map(int,input().split())
adj = [[] for _ in range(N+1)]
for _ in range(M):
f1,f2 = map(int,input().split())
adj[f1].append(f2)
adj[f2].append(f1)
result = [500000] + ([0]*N)
for i in range(1,N+1):
lst = []
for j in range(1,N+1):
if i == j:
continue
lst.append(bfs(i,j))
result[i] = sum(lst)
# print(result)
#[500000, 6, 8, 5, 5, 8]
answer = min(result)
print(result.index(answer))
1. 1을 기준으로 2,3,4,5까지의 최단거리를 lst에 담고 최종배열result의 인덱스, 즉 1번이면 result[1] 에 각각의 최단거리의 합을 넣는다
2. result에서 가장 적은 값의 인덱스가 구하려는답