백준12834 주간 미팅 작성일 2019-05-07 | In PS 문제 링크 http://icpc.me/12844 사용 알고리즘 Dijkstra 시간복잡도 O(E log V) 풀이 KIST를 시작점으로 잡아서 다익스트라를 돌리고, 씨알 푸드를 시작점으로 잡아서 한 번 더 다익스트라를 돌리면 쉽게 풀 수 있습니다. 전체 코드 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include <bits/stdc++.h> using namespace std; typedef pair<int, int> p; int n, v, e, a, b; vector<int> home; vector<p> g[1010]; vector<int> kist, cr; void dijkstra(vector<int> &dist, int s){ dist = vector<int>(v+1, 1e9+7); priority_queue<p> pq; pq.push({0, s}); dist[s] = 0; while(!pq.empty()){ int now = pq.top().second; int cost = -pq.top().first; pq.pop(); if(cost > dist[now]) continue; for(auto i : g[now]){ int nxt = i.first; int nxtCost = cost + i.second; if(dist[nxt] > nxtCost){ dist[nxt] = nxtCost; pq.push({-nxtCost, nxt}); } } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> v >> e >> a >> b; home.resize(n); for(int i=0; i<n; i++) cin >> home[i]; for(int i=0; i<e; i++){ int ss, ee, xx; cin >> ss >> ee >> xx; g[ss].push_back({ee, xx}); g[ee].push_back({ss, xx}); } dijkstra(kist, a); dijkstra(cr, b); long long ans = 0; for(auto i : home){ long long di = 0; if(kist[i] > 1e9) di--; else di += kist[i]; if(cr[i] > 1e9) di--; else di += cr[i]; ans += di; } cout << ans; }