#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});


간선의 가중치 저장하는게 이 방법 말고는 없나요