728x90
반응형
https://www.acmicpc.net/problem/17396
1. Logic
시작점에서 출발해서 다른 정점들을 거쳐 n-1번째 노드에 도착 하는 최단 거리를 구해야 하기 때문에 다익스트라를 사용해서 풀었다.
와드나 시야가 있는지를 체크하기 위해 bool sight배열을 선언 후 sight배열이 true면 continue하도록 조건을 넣어준 후 다익스트라를 돌리면 된다.
2. Code
#include<bits/stdc++.h>
using namespace std;
long long n, m;
const long long INF = LLONG_MAX;
long long dist[100001];
vector<pair<long long, long long>> graph[100001];
bool sight[100001];
void dijkstra() {
priority_queue<pair<long long, long long>> pq;
dist[0] = 0;
pq.push({0, 0});
while(!pq.empty()) {
long long cur = pq.top().second;
long long cost = -pq.top().first;
pq.pop();
if(dist[cur] < cost) continue;
for(int i = 0; i < graph[cur].size(); i++) {
long long next = graph[cur][i].first;
long long nCost = cost + graph[cur][i].second;
if(sight[next] && next != n-1) continue;
if(dist[next] > nCost) {
dist[next] = nCost;
pq.push({-nCost, next});
}
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
for(int i = 0; i < 100001; i++) {
dist[i] = INF;
}
cin >> n >> m;
for(int i = 0; i < n; i++) {
cin >> sight[i];
}
for(int i = 0; i < m; i++) {
long long start, end, cost;
cin >> start >> end >> cost;
graph[start].push_back({end, cost});
graph[end].push_back({start, cost});
}
dijkstra();
if(dist[n-1] == INF) cout << -1;
else cout << dist[n-1];
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 17142 연구소 3 C++ :: BFS (1) | 2023.12.11 |
---|---|
[백준/Baekjoon] 1445 일요일 아침의 데이트 C++ :: Dijkstra & Graph (1) | 2023.12.10 |
[백준/Baekjoon] 18352 특정 거리의 도시 찾기 C++ :: Graph & Dijkstra (0) | 2023.12.08 |
[백준/Baekjoon] 1388 바닥 장식 C++ :: Implementation (2) | 2023.12.07 |
[백준/Baekjoon] 2234 성곽 C++ :: BFS & Bit masking (1) | 2023.12.07 |