sllovells   4년 전

처음 올려보는 질문글이네요 많이 부족하지만 잘부탁드립니다!

일단 제가 생각한 풀이방법은 다음과 같습니다.


---------------------------------------------------------------------------------------------------------

1. 각 마을까지의 최소경로를 구해서 map에 저장 --> 플로이드 와샬 알고리즘 사용

    map[i][j] : i에서 j까지 가는 최단 경로

2. 최소경로 그래프를 가지고 사이클을 이루는지 확인

3. 사이클을 이루는 것 중 최소값을 출력

-----------------------------------------------------------------------------------------------------------------


이렇게 하고 다음과 같이 코드를 짰는데요,

문제에서 도로의 값은 "10,000이하의 자연수"라고 했고, 저는 자연수에는 0이 포함되지 않기에

처음 map에 별다른 값을 넣어주지 않고 도로가 존재하는 마을만 받아서 도로값을 넣어주었습니다.

그리고 플로이드 와샬 알고리즘을 사용해서 각 마을까지의 최소경로를 저장하고,

마지막으로 사이클을 이루는지 안이루는지를 알아보기 위해서 

if(map[i][j]>0 && map[j][i]>0) { result = Math.min(result, map[i][j]+map[j][i]); }

라고 조건문을 줬습니다.


이렇게 하면 안되는 이유가 있을까요?

같은 로직으로 처음 map에 10001을 넣어주고 사이클을 이루는지 알아볼때, 

if(map[i][j]<=10000 && map[j][i]<=10000) { result = Math.min(result, map[i][j]+map[j][i]); }

이라고 조건을 주니 맞았습니다.


두개의 차이는 처음 map에 10001을 넣어주고 시작하느냐 아니면 안넣어주고 시작하느냐 차이같은데

도대체 왜 0을 기준으로 사이클을 이루는지 조건을 주면 안되는지,

왜 처음에 map에 무한대값 혹은 10001을 넣어서 시작해야하만 하는건지 모르겠습니다.

무한대 또는 특정값을 넣어주는 이유가 뭔가요?

넣어주지 않고 다음과 같이 코딩을 하면 나올 수 있는 반례가 있을 것 같은데 제머리로는 도저히 생각이 나지 않습니다..

긴 글인데 읽어주셔서 감사합니다.

3587jjh   4년 전

map값을 0으로 주면 36째줄이 min이기 때문에 경로가 없을수도 있음에도 불구하고 그 경로를 채택하게 됩니다.

sllovells   4년 전

아 감사합니다!

3 2 

1 2 1

2 1 2

이렇게만 돌려도 왜안되는지 나오네요 ..

댓글을 작성하려면 로그인해야 합니다.