C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のKストップ内で最も安いフライト


m個のフライトで接続されたn個の都市があるとします。各フライトはuから始まり、価格wでvに到着します。すべての都市とフライトがあり、開始都市srcと目的地dstがある場合、ここでのタスクは、最大kストップでsrcからdstまでの最も安い価格を見つけることです。そのようなルートがない場合は、-1を返します。

したがって、入力がn =3、edges =[[0,1,100]、[1,2,100]、[0,2,500]]、src =0、dst =2、k =1の場合、出力は次のようになります。 200

C++のKストップ内で最も安いフライト

これを解決するには、次の手順に従います-

  • Dataと呼ばれる1つのデータ構造を作成します。これは、node、dist、およびvalを保持できます

  • 1つの2Dアレイコストを定義する

  • コスト:=次数(n + 1)x(K + 10)の1つの2D配列これを無限大で埋める

  • 1つの3D配列グラフを定義する

  • 初期化i:=0の場合、i <フライトのサイズの場合、更新(iを1増やします)、実行-

    • u:=フライト[i、0]

    • v:=フライト[i、1]

    • グラフの最後に{v、flights [i、2]}を挿入します[u]

  • 1つの優先キューを定義するq

  • Data(src、0、0)をq

    に挿入します
  • cost [src、0]:=0

  • ans:=-1

  • (qが空ではない)間、-

    • temp:=qの最上位要素

    • curr:=temp.node

    • qから要素を削除

    • dist:=temp.dist

    • currがdstと同じ場合、-

      • 戻り温度コスト

    • (距離を1増やします)

    • dist> K + 1の場合、-

      • 次の部分を無視し、次の反復にスキップします

    • 初期化i:=0の場合、i

      • 隣人:=グラフ[curr、i、0]

      • cost [neighbour、dist]> cost [curr、dist --1] +graph [curr、i、1]の場合、-

        • cost [neighbour、dist]:=cost [curr、dist --1] +グラフ[curr、i、1]

        • Data(neighbour、dist、cost [neighbour、dist])をq

          に挿入します
  • -1を返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
struct Data{
   int node, dist, cost;
   Data(int a, int b, int c){
      node = a;
      dist = b;
      cost = c;
   }
};
struct Comparator{
   bool operator() (Data a, Data b) {
      return !(a.cost < b.cost);
   }
};
class Solution {
public:
   vector<vector<int>> cost;
   int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K) {
      cost = vector<vector<int> >(n + 1, vector<int>(K + 10, INT_MAX));
      vector<vector<int> > graph[n];
      for (int i = 0; i < flights.size(); i++) {
         int u = flights[i][0];
         int v = flights[i][1];
         graph[u].push_back({ v, flights[i][2] });
      }
      priority_queue<Data, vector<Data>, Comparator> q;
      q.push(Data(src, 0, 0));
      cost[src][0] = 0;
      int ans = -1;
      while (!q.empty()) {
         Data temp = q.top();
         int curr = temp.node;
         q.pop();
         int dist = temp.dist;
         if (curr == dst)
            return temp.cost;
         dist++;
         if (dist > K + 1)
            continue;
         for (int i = 0; i < graph[curr].size(); i++) {
            int neighbour = graph[curr][i][0];
            if (cost[neighbour][dist] > cost[curr][dist - 1] + graph[curr][i][1]) {
               cost[neighbour][dist] = cost[curr][dist - 1] + graph[curr][i][1];
               q.push(Data(neighbour, dist, cost[neighbour][dist]));
            }
         }
      }
      return -1;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{0,1,100},{1,2,100},{0,2,500}};
   cout << (ob.findCheapestPrice(3, v, 0, 2, 1));
}

入力

3, {{0,1,100},{1,2,100},{0,2,500}}, 0, 2, 1

出力

200

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r