https://www.acmicpc.net/problem/17396
이 문제의 경우 전형 적인 다익스트라 알고리즘으로 풀 수 있을거 같았다 그 이유는 첫시작 점이 0 그리고 endPoint인 n-1 까지 가는 것으로 정해졌기에
void djikstraSolution(int start) {
int startNode = start;
int toCost = 0;
djikstra_pq.push({ toCost,start });
while (!djikstra_pq.empty()) {
int toVertex = djikstra_pq.top().second;
long long toCost = djikstra_pq.top().first;
djikstra_pq.pop();
if (distanceV[toVertex] < toCost)
continue;
for (int i = 0; i < edgeList[toVertex].size(); i++) {
int nextVertex = edgeList[toVertex][i].second;
long long nextCost = edgeList[toVertex][i].first;
if (distanceV[nextVertex] > toCost + nextCost && (canGo[nextVertex] || nextVertex==n-1)) {
distanceV[nextVertex] = toCost + nextCost;
djikstra_pq.push({ toCost + nextCost,nextVertex });
}
}
}
}
굳이 플로이드 와샬로 전체 의 거리는 구할 필요가 없기 때문이다
항상 다익스트라에서 쓰는 로직과 비슷하다 일단 StartVertex를 StarVertex까지의 거리가 0이라 두고 큐에다가 넣는다
그후 edgeList에서 startNode와 연결된 모든 노드들과 계산하여 거리를 구한후 priority queue에 넣는다 이를 반복하면 결국에 마지막 노드까지 가는거리가 최단거리로 완성이 된다.
이문제의 경우 단 djikstra를 풀때 조건이 하나가 추가되는데 해당 vertex의 시야값이 1이면 가지 않는 것이다
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 1234987654321
priority_queue < pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> djikstra_pq;
vector<pair<int, long long>> edgeList[300000];
vector<long long> distanceV(300000);
bool canGo[300000] = { 0, };
int n, m;
void djikstraSolution(int start) {
int startNode = start;
int toCost = 0;
djikstra_pq.push({ toCost,start });
while (!djikstra_pq.empty()) {
int toVertex = djikstra_pq.top().second;
long long toCost = djikstra_pq.top().first;
djikstra_pq.pop();
if (distanceV[toVertex] < toCost)
continue;
for (int i = 0; i < edgeList[toVertex].size(); i++) {
int nextVertex = edgeList[toVertex][i].second;
long long nextCost = edgeList[toVertex][i].first;
if (distanceV[nextVertex] > toCost + nextCost && (canGo[nextVertex] || nextVertex==n-1)) {
distanceV[nextVertex] = toCost + nextCost;
djikstra_pq.push({ toCost + nextCost,nextVertex });
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> canGo[i];
canGo[i] = !canGo[i];
}
for (int i = 0; i < m; i++) {
int from, to, cost;
cin >> from >> to >> cost;
edgeList[from].push_back({ cost,to });
edgeList[to].push_back({ cost,from });
}
distanceV.assign(n , INF);
djikstraSolution(0);
if (distanceV[n - 1] >= INF)
cout << -1;
else
cout << distanceV[n-1];
}
전체 코드는 위와 같다