[プログラマ]配信


📒コンセプトの使用

  • Dijkstra Algorithm
  • stack, queue
  • 📌問題の説明


    Nの村からなる国があります.この国の村ごとに1からNまで番号が付けられています.それぞれの村は双方向に通行する道を結んでおり、異なる村の間を移動するときはこの道を通らなければならない.道路を通るのにかかる時間は道路によって異なります.今の1番村のレストランから食べ物を各村に送りたいです.各村から注文を受けたいのですが、N村の中でK時間以下に配達できる村でしか注文を受けられないと思います.
    村落個数N、各村落を結ぶ道路の情報路、配達可能な食べ物の時間Kをパラメータとした場合は、解関数を完了し、食べ物の注文を受けられる村落個数を返してください.
    せいげんじょうけん
  • 村の個数Nは1以上50以下の自然数である.
  • 道路の長さ(道路情報の個数)は1または2000以下である.
  • 道路の各要素は、村を結ぶ各道路の情報を表す.
  • 道路は、3つの長さの配列であり、順序(a、b、c)である.
    a,b(1≦a,b≦N,a!=b)は道路が接続された2つの村の番号であり、c(1≦c≦10000,cは自然数)は道路を通過するのに要する時間である.
  • の2つの村a,bを結ぶ道路は複数あることができる.
  • 号道路の情報は何度も繰り返され、提供できません.
  • Kは配送可能な時間を示し、500000を超えない.
  • 任意の2つの村の間には常に移動可能な経路が存在する.
  • 1番村のレストランはK以下の時間内に食事を送ることができる村の数を返してください.
  • 📌インプリメンテーション

    #include <iostream>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    
    int solution(int N, vector<vector<int> > road, int K) {
        int answer = 0;
        //Dijkstra사용을 위한 queue
        queue<int> current;
        //최소값을 저장하는 백터
        vector<int> dist(N+1, 100000);
        //마을의 경로와 가중치 저장.
        vector<vector<pair<int, int>>> route(N+1);
        
        current.push(1);
        dist[1]=0;
        
        for(int i=0; i<road.size(); i++){
            route[road[i][0]].push_back({road[i][1], road[i][2]});
            route[road[i][1]].push_back({road[i][0], road[i][2]});
        }
    	
        //Dijkstra Algorithm사용
        while(!current.empty()){
            int cur=current.front();
            current.pop();
            for(int i=0; i<route[cur].size(); i++){
                if(dist[route[cur][i].first]==100000||dist[route[cur][i].first]>dist[cur]+route[cur][i].second){
                    dist[route[cur][i].first]=dist[cur]+route[cur][i].second;
                    current.push(route[cur][i].first);
                }
            }
        }
        
        for(int i=1; i<dist.size(); i++){
            if(dist[i]<=K){
                answer++;
            }
        }
        
        return answer;
    }

    📌注意点

  • Dijkstraアルゴリズムを知っておく必要があります.
  • 最大、最小のパスの問題を求めます.
  • キューの使用方法.