나는 인접행렬은 노드가 앞이고, pq는 가중치가 앞인 게 헷갈려서 커스텀 자료구조를 사용했다.
이제 정점을 하나씩 꺼내면서 연결된 노드들을 pq에 담으면 된다.
단, 다음 노드의 가중치가 현재 노드와 다음 노드 가중치의 합보다 작다면 넣는다.
3. 전체 코드
#include<bits/stdc++.h>usingnamespacestd;usingpii=pair<int,int>;constintINF=987654321;intV,E,K,u,v,w;vector<pii>adj[20'002];intvis[20'002];// customstructcomp{intv,w;comp(int_v,int_w){v=_v,w=_w;}booloperator<(constcomp&other)const{returnw>other.w;}};voidDijkstra(){priority_queue<comp>pq;pq.push({K,0});vis[K]=0;while(!pq.empty()){autocur=pq.top();pq.pop();// 연결된 정점들을 꺼내는데for(autonxt:adj[cur.v])// 갱신할 가중치가 더 작을 때만 pq에 넣는다.if(vis[nxt.first]>cur.w+nxt.second){pq.push({nxt.first,cur.w+nxt.second});vis[nxt.first]=cur.w+nxt.second;}}}intmain(){ios::sync_with_stdio(false);cin.tie(NULL);cin>>V>>E>>K;while(E--){cin>>u>>v>>w;adj[u].push_back({v,w});}fill(vis,vis+V+1,INF);// 0~V번까지 INF로 초기화Dijkstra();for(inti=1;i<=V;i++){if(vis[i]==INF)cout<<"INF\n";elsecout<<vis[i]<<'\n';}return0;}