본문 바로가기
BEB/algorithm

47_Dijkstra

by ddanss 2023. 1. 22.
728x90
function Dijkstra(num, edges, start, end) {
  let fix = new Array(102).fill(0); //고정되었는지
  let d = new Array(102).fill(1234567); //거리
  let adj = {};//이렇게하고 바로 push를 하지 못하기때문에
  for(let i=1;i<=num;i++) adj[i] = []; //이것도 처리해줘야한다
  
  for(let i=0;i<edges.length;i++) { //입력된 정점들을 연결하고 거리까지 저장해둔다
    adj[edges[i][0]].push({node: edges[i][1], distance: edges[i][2]});
    adj[edges[i][1]].push({node: edges[i][0], distance: edges[i][2]});
  }
  
  d[start] = 0; //자기자신으로 가는건 0
  
  for(;;) {
    let idx = -1; //초기값을 -1로 잡고
    for(let i=1;i<=num;i++) {
      if(fix[i]) continue; //이미 fix 되어있으면 continue;

      if(idx===-1) idx = i; //초기값이면 바로 나오는 i값을 idx에 넣고
      else if(d[i]<d[idx]) idx=i; //이미 idx에 값이 들어가있으면 i와 누가 더 짧은 거리인지 비교한다
    }
    if(idx===-1 || d[idx] === 1234567) break; //모두 fix되었거나 갈 수 있는 방법이 없으면 break;
    fix[idx]=1; //가장 작은 값이니 고정시켜둔다
    for(let i=0;i<adj[idx].length;i++) {
      d[adj[idx][i].node] = Math.min(d[adj[idx][i].node], d[idx]+adj[idx][i].distance);
    }
  }
  return d[end];//end까지의 거리 출력
}
반응형

'BEB > algorithm' 카테고리의 다른 글

48_FloydWarshall  (0) 2023.01.19
46_0-1Knapsack  (0) 2023.01.15
45_subsetSum  (0) 2023.01.09
41_countIslands  (0) 2022.12.22
40_longestPalindrome 가장긴 팰린드롬  (0) 2022.12.20

댓글