다익스트라로 푸는 문제. 시간 초과 날 것 같았는데 안나네 ..
dijkstra
함수를 만들어 계산하였다. 모든 노드까지를 무한대로 두고 (나 같은 경우, 노드가 최대 200개, 요금은 최대 100,000이므로 20,000,000 이상은 안나올 것이라 생각해 정의해주었다) 우선 순위 큐를 이용해 최단 노드를 계속 갱신해준다.[a]
와 [b]
를 더해주면 처음부터 각자 가는 것이다.a
와 b
까지는 각자 가는 것으로 다시 dijkstra
를 구해준다.#include <string>
#include <vector>
#include <queue>
#define INF 20000000
using namespace std;
vector<int> dijkstra(vector<vector<pair<int,int>>> &adj, int s)
{
vector<int> dist(adj.size(), INF);
dist[s] = 0;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
pq.push({0,s});
while(!pq.empty())
{
int cost = pq.top().first;
int cur = pq.top().second;
pq.pop();
for(int i=0;i<adj[cur].size();i++)
{
pair<int,int> node = adj[cur][i];
if(cost+node.first < dist[node.second])
{
pq.push({node.first+cost, node.second});
dist[node.second] = cost+node.first;
}
}
}
return dist;
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
int answer = 0;
vector<vector<pair<int,int>>> adj(n+1); // 인접리스트
for(int i=0;i<fares.size();i++) // 초기화
{
int stt = fares[i][0];
int end = fares[i][1];
int cost = fares[i][2];
adj[stt].push_back({cost, end});
adj[end].push_back({cost, stt});
}
vector<int> sttRoute = dijkstra(adj, s);
answer = sttRoute[a] + sttRoute[b]; // 처음부터 각자 가는거
for(int i=1;i<=n;i++)
{
if(i == s) continue;
int tmp = sttRoute[i]; // i까지는 같이 가고
vector<int> tmpArr = dijkstra(adj, i);
tmp += tmpArr[a] + tmpArr[b]; // 각자 집 따로 가기
answer = min(answer, tmp);
}
return answer;
}