코딩테스트/SWEA

[Python, 파이썬] SWEA 2814. 최장 경로

알코딩 2024. 10. 16. 00:22

N개의 정점과 M개의 간선으로 구성된 가중치가 없는 무방향 그래프에서의 
최장 경로의 길이를 계산하는 문제.

 

 

def DFS(i, now):

    global all_max

    if(now > all_max):
        all_max = now

    for child in graph[i]:
        if not depth[child]: # 방문하지 않았을 시

            depth[child] = True
            DFS(child, now+1) # 자식 노드로 이동
            depth[child] = False # 백트래킹
              

T = int(input()) # 테스트케이스 수 T

for test_case in range(1, T+1):

    N, M = map(int, input().split()) # 자연수 N, M
    graph = [[] for _ in range(N+1)] # 인접 리스트

    for i in range(M):
        s, e = map(int, input().split()) # 간선 입력받기
        
        graph[s].append(e)
        graph[e].append(s)

    all_max = 0 # 모든 최장 경로

    # 최장 경로 길이 계산
    for i in range(1, N+1):
        depth = [False]*(N+1) # 방문 여부 저장 배열
        depth[i] = True # 시작하는 노드를 방문 처리
        DFS(i, 1) # 탐색 시작
            
    print("#%d %d" %(test_case, all_max))    
 
 
 

 

 

[문제풀이]


 

그래프의 최장 경로를 계산해야 하는데, 어떤 정점에서 시작하는지 딱 집어지지 않았으므로 모든 정점에서의 각 경로를 계산해서 그 중 최장 경로를 찾아야 한다.

 

보통 모든 정점 쌍의 경로는 플로이드 워셜을 쓰지만 여기선 불가능!

왜냐면, 한번 간 경로는 갈 수 없기 때문인데, 플로이드는 그런 제약을 걸 수 없다.

그래서 DFS로 탐색해야 하는데 여기서 그냥 DFS를 쓸 수는 없다.

 

 

이렇게 사이클이 있는 그래프의 경우 DFS로 탐색할 때 문제가 발생한다.

최장 경로 : 1 - 2 - 3 - 7 - 4 - 5 - 6
 

1 - 2 - 3 이후 이동할 수 있는 노드는 4 or 7이다.

그런데 여기서 4로 먼저 이동하게 되면 4를 방문체크를 하여 1 - 2 - 3 - 7 - 4 경로가 불가능해진다.

즉, 사이클이 있으면 한 노드를 먼저 방문 시 다음번 노드를 방문할 수가 없어진다.

 

if not depth[child]: # 방문하지 않았을 시
    depth[child] = True
    DFS(child, now+1) # 자식 노드로 이동
    depth[child] = False # 백트래킹
 

그래서 이렇게 백트래킹을 사용해서 DFS로 풀어줘야 모든 경로를 다 확인할 수 있다.