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