https://www.acmicpc.net/problem/17396
[필자 사고]
전형적인 다익스트라 문제이다.
이 문제의 중요한 점은 ward배열이다. 즉 발각 되냐 안되냐에 있다.
와드가 1로 되어 있는 곳은 탐색을 하면 안되므로 그 부분을 신경 써주면 된다.
또한 값들이 매우 크다. int형 범위로는 담을 수 없을수도 있기 때문에 사전에 long으로 바꿔서 문제를 풀어준다.
[소스 코드]
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <queue>
#include<cstring>
#include <string>
using namespace std;
typedef pair<long, int> Node;
int N, M;
vector<int> ward;
vector<vector<Node>> Arr;
vector<long> pathLoad;
vector<int> visited;
void Dijkstra() {
priority_queue<Node, vector<Node>, greater<Node>> pq;
pq.push({ 0,0 });
pathLoad[0] = 0;
while (!pq.empty()) {
int nowIdx = pq.top().second;
long ac_path = pq.top().first;
if (nowIdx == N - 1) {
cout << ac_path;
return;
}
pq.pop();
if (visited[nowIdx])continue;
visited[nowIdx] = true;
for (Node nextNode : Arr[nowIdx]) {
int nextIdx = nextNode.second;
int nextCost = nextNode.first;
if (ward[nextIdx] == 1)continue;
if (pathLoad[nextIdx] > pathLoad[nowIdx] + nextCost) {
pathLoad[nextIdx] = pathLoad[nowIdx] + nextCost;
pq.push({ pathLoad[nextIdx],nextIdx });
}
}
}
}
void Input() {
cin >> N >> M;
Arr.resize(N);
pathLoad.resize(N, LONG_MAX);
visited.resize(N, false);
ward.resize(N);
for (int i = 0; i < N; i++) {
cin >> ward[i];
}
ward[N - 1] = 0;
for (int i = 0; i < M; i++) {
int s, e, w;
cin >> s >> e >> w;
Arr[s].push_back({ w,e });
Arr[e].push_back({ w,s });
}
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
Dijkstra();
if (pathLoad[N - 1] == LONG_MAX) {
cout << -1;
}
}
'백준 > 그래프' 카테고리의 다른 글
백준 5972 c++ "택배 배송" -[PlusUltraCode] (0) | 2024.02.27 |
---|---|
백준 10282 c++ "해킹" -[PlusUltraCode] (0) | 2024.02.27 |
백준 1446 c++ "지름길" -[PlusUltraCode] (2) | 2024.02.27 |
백준 14938 c++ "서강그라운드" -[PlusUltraCode] (2) | 2024.02.27 |
백준 2665 c++ -[PlusUltraCode] (0) | 2024.02.27 |