링크
세줄 요약
- 한 정점에서 모든 정점으로의 최단거리를 구해야한다.
- 모든 간선의 가중치가 양수이다.
- 위 두 조건을 만족하는 최단 경로를 알고리즘은 다익스트라 알고리즘이다.
#include <vector>
#include <queue>
#define max_int 51
#define max_val 2500001
using namespace std;
int d[max_int];
struct info{
int cur;
int cost;
};
struct cmp{
bool operator()(const info &a, const info &b){
return a.cost > b.cost;
}
};
vector<info> v[max_int];
int solution(int N, vector<vector<int> > road, int K) {
int answer = 0;
for(int i=0; i<road.size(); i++){
int node = road[i][0];
int cur = road[i][1];
int cost = road[i][2];
v[node].push_back({cur, cost});
v[cur].push_back({node, cost});
}
for(int i=1; i<=N; i++) d[i] = max_val;
priority_queue<info, vector<info>, cmp> pq;
d[1] = 0;
pq.push({1, d[1]});
while(!pq.empty()){
info cur = pq.top();
pq.pop();
int c_node = cur.cur;
for(int i=0; i<v[c_node].size(); i++){
info next = v[c_node][i];
int n_node = next.cur;
int n_cost = next.cost;
if(d[n_node] > d[c_node] + n_cost){
d[n_node] = d[c_node] + n_cost;
pq.push({n_node, d[n_node]});
}
}
}
for(int i=1; i<=N; i++){
if(d[i] <= K) answer++;
}
return answer;
}