[プログラマー]最も遠いノード
回答日:2021-08-16
質問する
質問する
質問リンク:https://programmers.co.kr/learn/courses/30/lessons/49189
アクセスと解析
1番ノードから最も遠いノードがいくつあるかを知る必要があるのでDijkstraアルゴリズムを考えた.
典型的なDijkstraアルゴリズムを実現し,max element関数とlow boundを用いて最も遠いノードの個数を求めた.
コード#コード# #include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define INF 987654321
vector<pair<int, int>> v[20001];
vector<int> dijkstra(int start, int n) {
vector<int> dist(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int now = pq.top().second;
int cost = pq.top().first;
pq.pop();
if (dist[now] < cost) {
continue;
}
for (int i = 0; i < v[now].size(); i++) {
int next = v[now][i].first;
int nCost = cost + v[now][i].second;
if (dist[next] > nCost) {
dist[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return dist;
}
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
for (auto e : edge) {
v[e[0]].push_back(make_pair(e[1], 1));
v[e[1]].push_back(make_pair(e[0], 1));
}
vector<int> ret = dijkstra(1, n);
for (int i = 0; i <= n; i++) {
if (ret[i] == INF) {
ret[i] = -1;
}
}
sort(ret.begin(), ret.end());
int maxNum = *max_element(ret.begin(), ret.end());
answer = ret.end() - lower_bound(ret.begin(), ret.end(), maxNum);
return answer;
}
結果
フィードバック
Dijkstraアルゴリズムを知っていれば簡単に解決できる問題です.
Reference
この問題について([プログラマー]最も遠いノード), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-가장-먼-노드
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
1番ノードから最も遠いノードがいくつあるかを知る必要があるのでDijkstraアルゴリズムを考えた.
典型的なDijkstraアルゴリズムを実現し,max element関数とlow boundを用いて最も遠いノードの個数を求めた.
コード#コード# #include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define INF 987654321
vector<pair<int, int>> v[20001];
vector<int> dijkstra(int start, int n) {
vector<int> dist(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int now = pq.top().second;
int cost = pq.top().first;
pq.pop();
if (dist[now] < cost) {
continue;
}
for (int i = 0; i < v[now].size(); i++) {
int next = v[now][i].first;
int nCost = cost + v[now][i].second;
if (dist[next] > nCost) {
dist[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return dist;
}
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
for (auto e : edge) {
v[e[0]].push_back(make_pair(e[1], 1));
v[e[1]].push_back(make_pair(e[0], 1));
}
vector<int> ret = dijkstra(1, n);
for (int i = 0; i <= n; i++) {
if (ret[i] == INF) {
ret[i] = -1;
}
}
sort(ret.begin(), ret.end());
int maxNum = *max_element(ret.begin(), ret.end());
answer = ret.end() - lower_bound(ret.begin(), ret.end(), maxNum);
return answer;
}
結果
フィードバック
Dijkstraアルゴリズムを知っていれば簡単に解決できる問題です.
Reference
この問題について([プログラマー]最も遠いノード), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-가장-먼-노드
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define INF 987654321
vector<pair<int, int>> v[20001];
vector<int> dijkstra(int start, int n) {
vector<int> dist(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int now = pq.top().second;
int cost = pq.top().first;
pq.pop();
if (dist[now] < cost) {
continue;
}
for (int i = 0; i < v[now].size(); i++) {
int next = v[now][i].first;
int nCost = cost + v[now][i].second;
if (dist[next] > nCost) {
dist[next] = nCost;
pq.push(make_pair(nCost, next));
}
}
}
return dist;
}
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
for (auto e : edge) {
v[e[0]].push_back(make_pair(e[1], 1));
v[e[1]].push_back(make_pair(e[0], 1));
}
vector<int> ret = dijkstra(1, n);
for (int i = 0; i <= n; i++) {
if (ret[i] == INF) {
ret[i] = -1;
}
}
sort(ret.begin(), ret.end());
int maxNum = *max_element(ret.begin(), ret.end());
answer = ret.end() - lower_bound(ret.begin(), ret.end(), maxNum);
return answer;
}
フィードバック
Dijkstraアルゴリズムを知っていれば簡単に解決できる問題です.
Reference
この問題について([プログラマー]最も遠いノード), 我々は、より多くの情報をここで見つけました
https://velog.io/@bestcoders/프로그래머스-가장-먼-노드
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について([プログラマー]最も遠いノード), 我々は、より多くの情報をここで見つけました https://velog.io/@bestcoders/프로그래머스-가장-먼-노드テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol