Judge

Programmers - 배달

깡구_ 2022. 6. 24. 11:17

title: Programmers - 배달
date: 2022-06-21
tags:

  • Algorithm
  • Graph
  • Dijkstra




https://programmers.co.kr/learn/courses/30/lessons/12978


문제 요약

주어진 그래프에서 root 노드로부터 K 가중치 내로 이동 가능한 노드의 수를 구하여 return한다.


문제 풀이

전형적인 Dijkstra Graph 문제이다.
주어진 그래프를 인접행렬로 변환한 후, N-1번 거리를 갱신하여 root로부터 모든 노드로 가는 거리가 K 이하인 노드의 개수를 구한다.
갱신이 이루어지지 않을 때 갱신을 중단하여도 되지만, 최대 갱신 횟수는 N-1번이다. 중단 조건 구현이 귀찮아서 N-1번 갱신하였다.
가중치에 -가 존재한다면 Floyd-Warshall 알고리즘을 사용하여야 한다.


프로그램

#include <vector>
#include <algorithm>

using std :: vector ;

int solution ( int N , vector < vector < int > > road , int K )
{
    int idrgPath [ 50 ] [ 50 ] = { 0 , } ;
    bool brgVisit [ 50 ] = { false , } ;
    int iEnd = 0 ;
    int iWeight = 0 ;
    int iAnswer = 1 ;



    std :: fill ( idrgPath [ 0 ] , idrgPath [ 0 ] + 2500 , 1e6 ) ;            // For impossible node, fill with 1e6 > ( 50 * 1e4 )

    for ( int i = 0 ; i < road.size () ; ++ i )                // Initialize
    {
        int * ipTemp = road [ i ].data () ;
        int iStart = ipTemp [ 0 ] - 1 ;
        iEnd = ipTemp [ 1 ] - 1 ;
        iWeight = ipTemp [ 2 ] ;


        idrgPath [ iStart ] [ iEnd ] = std :: min ( idrgPath [ iStart ] [ iEnd ] , iWeight ) ;
        idrgPath [ iEnd ] [ iStart ] = std :: min ( idrgPath [ iEnd ] [ iStart ] , iWeight ) ;
    }

    brgVisit [ 0 ] = true ;

    for ( int i = 0 ; i < 49 ; ++i )                                    // Need to compute n - 1
    {
        iWeight = 1e6 ;

        for ( int j = 1 ; j < 50 ; ++j )                                // Find minimal path
        {
            if ( ( ! brgVisit [ j ] ) && ( idrgPath [ 0 ] [ j ] < iWeight ) )
            {
                iWeight = idrgPath [ 0 ] [ j ] ;
                iEnd = j ; 
            }
        }

        brgVisit [ iEnd ] = true ;
        for ( int j = 1 ; j < 50 ; ++j )                                // Update
        {
            idrgPath [ 0 ] [ j ] = std :: min ( idrgPath [ 0 ] [ j ] , idrgPath [ 0 ] [ iEnd ] + idrgPath [ iEnd ] [ j ] ) ;
        }
    }

    for ( int i = 1 ; i < 50 ; ++i )
    {
        if ( idrgPath [ 0 ] [ i ] <= K )
            ++ iAnswer ;
    }

    return iAnswer ;
}

'Judge' 카테고리의 다른 글

Programmers - 카펫  (0) 2022.06.24
Programmers - 괄호 회전하기  (0) 2022.06.24
Programmers - 2 x n 타일링  (0) 2022.06.24
Programmers - 짝지어 제거하기  (0) 2022.06.24
Programmers - 가장 큰 수  (0) 2022.06.24