プログラマの最も遠いノード
5038 ワード
質問する
https://programmers.co.kr/learn/courses/30/lessons/49189
コード#コード#
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
vector<vector<pair<int, int>>> graph(n+1);
priority_queue<pair<int, int>> pq;
vector<int> table(n+1,1e9);
for (auto i : edge){
graph[i[0]].push_back({1, i[1]});
graph[i[1]].push_back({1, i[0]});
}
pq.push({ 0,1 });
table[1] = 0;
int maxN = 0;
while (!pq.empty()){
int d = -pq.top().first;
int num = pq.top().second;
pq.pop();
if (table[num] < d) continue;
for (int i = 0; i < graph[num].size(); i++){
int cost = d + graph[num][i].first;
if (cost < table[graph[num][i].second]){
table[graph[num][i].second] = cost;
pq.push({-cost, graph[num][i].second});
maxN = max(maxN, cost);
}
}
}
for (int i : table){
if (i == maxN)
answer++;
}
return answer;
}
に答える
最初は隣接マトリクスでグラフを実現しようと思っていましたが、テストケース7、8、9号でタイムアウトが発生しました.
隣接マトリクスコード
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int solution(int n, vector<vector<int>> edge) {
int answer = 0;
int maxValue=0;
vector<vector<int>> graph(n,vector<int>(n,0));
for(auto i:edge){
graph[i[0]-1][i[1]-1]=-1;
graph[i[1]-1][i[0]-1]=-1;
}
for(int i=0;i<n;i++) graph[i][i]=-1;
queue<vector<int>> q;
q.push({0,0,1});
while(!q.empty()){
int y=q.front()[0];
int x=q.front()[1];
int dist=q.front()[2];
maxValue=max(maxValue,dist);
q.pop();
for(int i=0;i<n;i++){
if(graph[y][i]==-1){
graph[y][i]=dist;
q.push({y,i,dist+1});
}
if(graph[i][x]==-1){
graph[i][x]=dist;
q.push({i,x,dist+1});
}
}
}
for(int i=0;i<n;i++){
if(graph[i][i]==maxValue-1)answer++;
}
return answer;
}
グラフィックの実現方法は代表的な隣接マトリクス法と隣接リスト法があり、隣接マトリクス法ノードの個数が多ければ多いほどメモリの量やナビゲーションに要する時間が大きくなり、隣接リスト方式でグラフィックを実現してから解くことができれば良いと思いますが、すべての幹線の料金は1で、それから導出します.TRAアルゴリズムを用いて解いた.Reference
この問題について(プログラマの最も遠いノード), 我々は、より多くの情報をここで見つけました https://velog.io/@josajang98/가장-먼-노드テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol