• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

다익스트라에서 반대로 최장 거리를 구하는 코드에 대해 질문드립니다.

23.06.04 11:05 작성 조회수 468

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

 

class Node implements Comparable<Node>{

int v;

int c;

Node(int v, int c){

this.v=v;

this.c=c;

}

@Override

public int compareTo(Node o) {

return o.c-this.c; //최장거리를 구해야하니까 기존과 반대로

}

}

public class Main {

public static int[] dis;

public static ArrayList<Node>[] graph;

public static int n,m;

public static void dij(int s) {

PriorityQueue<Node> q = new PriorityQueue<>();

q.offer(new Node(s,0));

dis[s] = 0;

while(!q.isEmpty()) {

Node tmp = q.poll();

int now = tmp.v;

int nowcost = tmp.c;

if(nowcost<dis[now]) continue; //기존과 반대

for(Node ob : graph[now]) {

if(dis[ob.v]<nowcost+ob.c) { //기존과 반대

dis[ob.v]= nowcost+ob.c;

q.offer(new Node(ob.v, nowcost+ob.c));

}

}

}

}

 

만약 문제에서 최단거리가 아닌 최장 거리를 구하라면 클래스의 정렬 순서와 다익스트라 메소드를 기존과 반대로 구현하면 될까요??

답변 1

답변을 작성해보세요.

1

안녕하세요^^

다익스트라 알고리즘은 최소비용을 구하기 위해 만들어진 알고리즘입니다. 최대비용을 구하기 위해 정렬순서를 바꾸고, 다익스트라 내용을 반대로 하면 while(!q.isEmpty())문이 무한반복을 하게 됩니다. 만약 그래프에 사이클(회로)가 존재하고, 해당 사이클을 계속 회전하게 되면 비용이 계속 커지므로 우선순위 큐가 텅 비어서 멈추는 일이 발생하지 않습니다.

문제에 있는 입력예제를 예로 들면 그래프에서 2번, 3번, 4번 정점은 사이클(회로)를 이룹니다. 그래서 1번 정점에서 2번 정점으로 가는 최대비용을 다익스트라로 구한다면 1번 정점에서 2번 정점으로 가는 12비용부터 시작해서 2번, 3번, 4번 사이클을 무한 회전하면서 그 갑은 12, 24, 36 ...... 과 같이 12의 배수로 무한 증가하면서 while(!q.isEmpty()) 문이 무한 반복할 겁니다.