문제
https://www.acmicpc.net/problem/14284
풀이
간선 정보들 연결리스트로 관리하고, 최단 경로 길이 배열에 저장하고, 최단 경로 구할때 시간복잡도 줄이기 위해 우선순위 큐를 쓰는.. 가장 전형적인 다익스트라 문제였다.
다익스트라 문제들은 거의 풀이 형태가 같으니 한번 제대로 익혀놓는걸 추천한다!
#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
/*
특정 정점 s와 t가 연결이 되는 시점에서 간선 추가를 멈출 것
s와 t가 연결이 되는 시점의 간선의 가중치의 합이 최소가 되도록 추가하는 간선의 순서를 조정
-> 최솟값은?
*/
int n; // 정점의 개수
int m; // 간선 리스트의 수
int s, t;
vector<pair<int, int>> v[5001]; // 연결리스트
int d[5001]; // 최단 경로 길이
void solution() {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq; // 오름차순 정렬
pq.push({ 0, s }); // 거리는 0, 노드 s에서 출발
d[s] = 0; // 시작점까지의 거리는 0
while (!pq.empty()) {
pair<int, int> now = pq.top();
int distance = now.first;
int curr_node = now.second;
pq.pop();
if (d[curr_node] < distance) continue; // 최적의 상황이 아님
for (int i = 0; i < v[curr_node].size(); i++) {
int next_distance = distance + v[curr_node][i].second;
int next_node = v[curr_node][i].first;
if (next_distance < d[next_node]) { // 갱신
d[next_node] = next_distance;
pq.push({ d[next_node], next_node });
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
// 입력
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
v[a].push_back({ b, c });
v[b].push_back({ a, c }); // 무 방향 연결 그래프
}
cin >> s >> t;
// 로직
// 경로 길이 초기화
for (int i = 0; i <= n; i++) {
d[i] = INF;
}
// 결과 계산
solution();
// 출력
if (d[t] == INF) {
cout << "-1";
}
else {
cout << d[t];
}
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[백준/C++] #5021 왕위 계승 (위상 정렬) (0) | 2025.01.30 |
---|---|
[백준/C++] #11057 오르막 수 (DP) (0) | 2024.11.11 |
[백준/C++] #1904 01타일 (DP) (0) | 2024.11.11 |
[백준/C++] #1525 퍼즐 (BFS) (1) | 2024.09.01 |
[백준/C++] #4195 친구 네트워크 (Union Find) (1) | 2024.08.28 |