[プログラマー]タクシー料金の併用
回答日:2021年-08-05
質問する
質問する
質問リンク:https://programmers.co.kr/learn/courses/30/lessons/72413
アクセスと解析
以前はFloyd-Warshallアルゴリズムで解きましたが、今回はDijkstraアルゴリズムで解きます.
一般的なDijkstraアルゴリズムにより,与えられたs,a,bからすべてのノードに到達する最短経路を求めた.
そして、始点(s)から移動タクシーに乗り合わせる任意のノード(x)までの距離と、到着地(a,b)からノード(x)までのそれぞれの乗り換える距離の和の最短距離を求めた.
コード#コード# #include <string>
#include <vector>
#include <queue>
using namespace std;
#define INF 987654321
vector<pair<int, int>> map[201];
vector<int> dijkstra(int start) {
vector<int> distance(201, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
distance[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int cost = pq.top().first;
int now = pq.top().second;
pq.pop();
if (distance[now] < cost) {
continue;
}
for (int i = 0; i < map[now].size(); i++) {
int next = map[now][i].first;
int nCost = cost + map[now][i].second;
if (distance[next] > nCost) {
distance[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return distance;
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = 0;
for (auto f : fares) {
map[f[0]].push_back(make_pair(f[1], f[2]));
map[f[1]].push_back(make_pair(f[0], f[2]));
}
vector<int> from_s = dijkstra(s); // s에서 출발한 최단거리
vector<int> from_a = dijkstra(a); // a에서 출발한 최단거리
vector<int> from_b = dijkstra(b); // b에서 출발한 최단거리
answer = from_s[a] + from_s[b];
for (int i = 1; i <= n; i++) {
if (i == s) {
continue;
}
if (from_s[i] == INF || from_a[i] == INF || from_b[i] == INF) {
continue;
}
answer = min(answer, from_s[i] + from_a[i] + from_b[i]);
}
return answer;
}
結果
フィードバック
同じ問題を違うものにしようとする
Reference
この問題について([プログラマー]タクシー料金の併用), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-합승-택시-요금-iwud8gkh
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
以前はFloyd-Warshallアルゴリズムで解きましたが、今回はDijkstraアルゴリズムで解きます.
一般的なDijkstraアルゴリズムにより,与えられたs,a,bからすべてのノードに到達する最短経路を求めた.
そして、始点(s)から移動タクシーに乗り合わせる任意のノード(x)までの距離と、到着地(a,b)からノード(x)までのそれぞれの乗り換える距離の和の最短距離を求めた.
コード#コード# #include <string>
#include <vector>
#include <queue>
using namespace std;
#define INF 987654321
vector<pair<int, int>> map[201];
vector<int> dijkstra(int start) {
vector<int> distance(201, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
distance[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int cost = pq.top().first;
int now = pq.top().second;
pq.pop();
if (distance[now] < cost) {
continue;
}
for (int i = 0; i < map[now].size(); i++) {
int next = map[now][i].first;
int nCost = cost + map[now][i].second;
if (distance[next] > nCost) {
distance[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return distance;
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = 0;
for (auto f : fares) {
map[f[0]].push_back(make_pair(f[1], f[2]));
map[f[1]].push_back(make_pair(f[0], f[2]));
}
vector<int> from_s = dijkstra(s); // s에서 출발한 최단거리
vector<int> from_a = dijkstra(a); // a에서 출발한 최단거리
vector<int> from_b = dijkstra(b); // b에서 출발한 최단거리
answer = from_s[a] + from_s[b];
for (int i = 1; i <= n; i++) {
if (i == s) {
continue;
}
if (from_s[i] == INF || from_a[i] == INF || from_b[i] == INF) {
continue;
}
answer = min(answer, from_s[i] + from_a[i] + from_b[i]);
}
return answer;
}
結果
フィードバック
同じ問題を違うものにしようとする
Reference
この問題について([プログラマー]タクシー料金の併用), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-합승-택시-요금-iwud8gkh
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <string>
#include <vector>
#include <queue>
using namespace std;
#define INF 987654321
vector<pair<int, int>> map[201];
vector<int> dijkstra(int start) {
vector<int> distance(201, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
distance[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int cost = pq.top().first;
int now = pq.top().second;
pq.pop();
if (distance[now] < cost) {
continue;
}
for (int i = 0; i < map[now].size(); i++) {
int next = map[now][i].first;
int nCost = cost + map[now][i].second;
if (distance[next] > nCost) {
distance[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return distance;
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = 0;
for (auto f : fares) {
map[f[0]].push_back(make_pair(f[1], f[2]));
map[f[1]].push_back(make_pair(f[0], f[2]));
}
vector<int> from_s = dijkstra(s); // s에서 출발한 최단거리
vector<int> from_a = dijkstra(a); // a에서 출발한 최단거리
vector<int> from_b = dijkstra(b); // b에서 출발한 최단거리
answer = from_s[a] + from_s[b];
for (int i = 1; i <= n; i++) {
if (i == s) {
continue;
}
if (from_s[i] == INF || from_a[i] == INF || from_b[i] == INF) {
continue;
}
answer = min(answer, from_s[i] + from_a[i] + from_b[i]);
}
return answer;
}
フィードバック
同じ問題を違うものにしようとする
Reference
この問題について([プログラマー]タクシー料金の併用), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-합승-택시-요금-iwud8gkh
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について([プログラマー]タクシー料金の併用), 我々は、より多くの情報をここで見つけました https://velog.io/@bestcoders/프로그래머스-합승-택시-요금-iwud8gkhテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol