#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector < pair<int,int> > graph[20001];
priority_queue < pair <int,int> , vector< pair<int,int> > , greater < pair<int,int> > > pq; // 정점v까지의 최단거리, 정점 v
bool visited[20001];
int dist[20001];
void Dijkstar(int start) {
while(!pq.empty()) {
int s = pq.top().second;
int w = pq.top().first;
pq.pop();
visited[s] = true;
for ( int i = 0 ; i < graph[s].size(); i++ ) { // first = 도착정점 , second 가중치
if(visited[graph[s][i].first])
continue;
if ( dist[graph[s][i].first] > dist[s] + graph[s][i].second) {
dist[graph[s][i].first] = dist[s] + graph[s][i].second;
pq.push({dist[graph[s][i].first],graph[s][i].first});
}
}
}
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int edge, vertex, start;
cin >> vertex >> edge >> start;
for (int i = 1; i <=vertex; i++) {
dist[i] = 2500000;
}
int s,e,w;
for ( int i = 0; i < edge; i++) {
cin >> s >> e >> w;
graph[s].push_back({e,w});
}
pq.push({0,start}); // 최단거리 , 도착정점
dist[start] = 0;
visited[start] = true;
Dijkstar(start);
for ( int i = 1; i <= vertex; i++) {
if(dist[i] > 2000000) {
cout << "INF" << "\n";
}
else
cout << dist[i] << "\n";
}
}
개선하고 싶은게
for ( int i = 0 ; i < graph[s].size(); i++ ) { // first = 도착정점 , second 가중치
if(visited[graph[s][i].first])
continue;
if ( dist[graph[s][i].first] > dist[s] + graph[s][i].second) {
dist[graph[s][i].first] = dist[s] + graph[s][i].second;
pq.push({dist[graph[s][i].first],graph[s][i].first});
}
}
여기 부분인데 너무 복잡한거 같아서 graph[s][i].first , second 계속 쓰니까 무슨 의미로 썻는지 나도 헷갈리고..
원하는건 dist[x] = dist[s] + graph[i][j] 이런 느낌으로 줄이고 싶음.
int cost = graph[s][i].first /second 같이 따로 변수에 담는거 말고 graph 를 좀 개선할 방법을 찾고 있읍니다.
graph[s].push_back({e,w});
간선의 가중치 저장하는게 이 방법 말고는 없나요
변수 말고 레퍼런스로 담으면 메모리공간도 절약되고 좋잖음
for (auto& [next, cost] : graph[s]) // first는 next로 second는 cost로
와 이런건 본적도 없는데 제가 아는 for문은 (int i ; i < s ; i++ ) 이 끝... 저런건 그냥 남의 코드보고 저런것도 있네 하면서 검색해서 습득하는건가요
https://m.dcinside.com/board/ps/3969
https://m.dcinside.com/board/ps/3973
감사함니다 선생님
structured binding 쓰면 훨씬 짧게 쓸수있고, 간선 구조체를 따로 만들어서 써도 괜춘한듯