Algorithm

[SWEA] 2814. 최장 경로 D3

lluna 2021. 10. 14. 02:16
  • BFS에 거리를 추가하는 방식으로 구현하였다.
  • 테스트케이스 2개만 맞고 계속해서 오류가 떴다.
  • 추가로 테스트케이스를 넣어봤는데 맞는 답이 나왔는데도 통과하지 못했다.
  • 초기화도 했는데 무엇이 문제인지 머리가 터질 것 같다. ㅠㅠ
  • 대부분의 사람들이 dfs로 문제를 풀어서 힌트를 얻지 못했다.

결론 : BFS 로 풀 수 없다.

BFS 1차수정 (오류)

  • 일단 따로 table 필요 없이 visited 를 숫자배열로 배치
  • global 로 maxV 변수를 쓰기 때문에 return 따로 해주지 않아도 된다.
  • bfs 는 초기화시킬 필요 없을것 같고..
  • bfs로 풀 수 있는건가?
import sys
sys.stdin = open('input.txt')

from collections import deque

def number_of_vertex_bfs(graph, start_node):
    global maxV

    visited[start_node] = 1
    queue.append(start_node)

    while queue:
        node = queue.popleft()
        for next_node in range(1, N+1):
            if not visited[next_node] and graph[node][next_node]:
                visited[next_node] = visited[node] + 1
                queue.append(next_node)

    if max(visited) > maxV:
        maxV = max(visited)


T = int(input())

for tc in range(1, T + 1):
    N, M = map(int, input().split()) # N개의 정점, M개의 간선

    graph = [[0] * (N + 1) for _ in range(N + 1)]

    for i in range(M):
        ni, nj = map(int, input().split())
        graph[ni][nj] = 1
        graph[nj][ni] = 1

    maxV = 0
    for start_node in range(1, N + 1):
        queue = deque()
        visited = [0] * (N + 1)
        number_of_vertex_bfs(graph, start_node)

    print("#{} {}".format(tc, maxV))

 

BFS 첫 답안(오류)

def number_of_vertex(graph, start_node):
    visited = [False] * (N + 1)
    queue = []
    table = [0] * (N + 1)

    queue.append(start_node)
    visited[start_node] = True
    table[start_node] = 1

    while queue:
        node = queue.pop(0)
        next_nodes = [x+1 for x in range(N)]
        for next_node in next_nodes:
            if graph[node][next_node] == 1 and visited[next_node] != True:
                queue.append(next_node)
                visited[next_node] = True
                table[next_node] = table[node] + 1

    return max(table)


T = int(input())

for tc in range(1, T + 1):
    N, M = map(int, input().split()) # N개의 정점, M개의 간선

    # 그래프 초기화
    graph = [[0] * (N + 1) for _ in range(N + 1)]

    for i in range(M):
        ni, nj = map(int, input().split())
        graph[ni][nj] = 1
        graph[nj][ni] = 1

    numbers_of_vertex = []
    for start_node in range(1, N + 1):
        numbers_of_vertex.append(number_of_vertex(graph, start_node))

    print("#{} {}".format(tc, max(numbers_of_vertex)))

 

DFS 로 참고해서 풀이(PASS)

재귀와 백트래킹을 위한 초기화가 관건

import sys
sys.stdin = open('input2.txt')


def number_of_vertex_dfs(graph, node, cnt):
    global maxV

    for next_node in range(1, N+1):
        if not visited[next_node] and graph[node][next_node]:
            visited[next_node] = 1
            number_of_vertex_dfs(graph, next_node, cnt+1)
            visited[next_node] = 0

    if cnt > maxV:
        maxV = cnt


T = int(input())

for tc in range(1, T + 1):
    N, M = map(int, input().split()) # N개의 정점, M개의 간선

    # 그래프 초기화
    graph = [[0] * (N + 1) for _ in range(N + 1)]

    for i in range(M):
        ni, nj = map(int, input().split())
        graph[ni][nj] = 1
        graph[nj][ni] = 1

    queue = []
    visited = [0] * (N + 1)

    maxV = 0

    for start_node in range(1, N + 1):
        visited[start_node] = 1
        number_of_vertex_dfs(graph, start_node, 1)
        visited = [0] * (N + 1)

    print("#{} {}".format(tc, maxV))