
리뷰

https://www.acmicpc.net/problem/18223
1에서 v까지의 최단 경로와 p를 거쳐가는 경로의 길이가 같은지 여부를 찾는 문제
전역 변수
- V : 배열의 최대 크기를 저장할 상수 변수
- v : 정점의 개수를 저장할 변수
- e : 간선의 개수를 저장할 변수
- p : 건우가 위치한 정점을 저장할 변수
- Edge : 간선 정보 다음 노드 nn, 간선의 크기 nv를 정의할 구조체
- edges : 간선 정보를 저장할 Edge타입 벡터
- Pos : 시뮬레이션 정보 현재 노드 cn, 누적 간선 크기 cv를 정의할 구조체, cv를 기준으로 오름차순 정렬한다.
함수
1. dijkstra
int dijkstra(int sn, int dn) {
priority_queue<Pos> pq;
pq.push({ sn, 0 });
vector<int> dist(v + 1, 2e9);
dist[sn] = 0;
while (!pq.empty()) {
Pos pos = pq.top(); pq.pop();
int cn = pos.cn, cv = pos.cv;
if (cn == dn) return dist[cn];
if (dist[cn] < cv) continue;
for (const Edge& edge : edges[cn]) {
int nn = edge.nn, nv = edge.nv;
if (dist[nn] > cv + nv) {
dist[nn] = cv + nv;
pq.push({ nn, dist[nn] });
}
}
}
return -1;
}
다익스트라를 통해 sn~dn까지의 최단 거리를 구하는 함수
문제풀이
- 변수 v, e, p에 값을 각각 입력 받아준다.
- e개의 간선 정보를 입력 받아 edges배열에 양방향으로 추가해 준다.
- 변수 fast에 dijkstra함수를 통해 1~v까지의 최단 경로를 구해 저장해 준다.
- fast가 1~p까지의 최단 경로, p~v까지의 최단 경로를 더한 값과 같다면 "SAVE HIM"을 출력해 준다.
- 만약 같지 않다면 "GOOD BYE"를 출력해 준다.
트러블 슈팅
없음
참고 사항
없음
정답 코드
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int V = 5001;
int v, e, p;
struct Edge {
int nn, nv;
};
vector<Edge> edges[V];
struct Pos {
int cn, cv;
bool operator<(const Pos& other) const {
return cv > other.cv;
}
};
int dijkstra(int sn, int dn) {
priority_queue<Pos> pq;
pq.push({ sn, 0 });
vector<int> dist(v + 1, 2e9);
dist[sn] = 0;
while (!pq.empty()) {
Pos pos = pq.top(); pq.pop();
int cn = pos.cn, cv = pos.cv;
if (cn == dn) return dist[cn];
if (dist[cn] < cv) continue;
for (const Edge& edge : edges[cn]) {
int nn = edge.nn, nv = edge.nv;
if (dist[nn] > cv + nv) {
dist[nn] = cv + nv;
pq.push({ nn, dist[nn] });
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> v >> e >> p;
while (e--) {
int a, b, c; cin >> a >> b >> c;
edges[a].push_back({ b, c });
edges[b].push_back({ a, c });
}
int fast = dijkstra(1, v);
if (fast == dijkstra(1, p) + dijkstra(p, v)) cout << "SAVE HIM";
else cout << "GOOD BYE";
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[P4] 백준 11376번 열혈강호 2 C++ 이분 매칭 (1) | 2025.04.07 |
---|---|
[P4] 백준 11375번 열혈강호 C++ 이분 매칭 (0) | 2025.04.06 |
[P3] 백준 12895번 화려한 마을 C++ 세그먼트 트리, 느리게 갱신되는 세그먼트 트리, 비트마스킹 (1) | 2025.04.03 |
[P5] 백준 1777번 순열복원 C++ 세그먼트 트리 (0) | 2025.04.02 |
[P4] 백준 1849번 순열 C++ 세그먼트 트리 (0) | 2025.04.01 |