728x90
반응형

14284번: 간선 이어가기 2
문제
https://www.acmicpc.net/problem/14284
14284번: 간선 이어가기 2
정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.
www.acmicpc.net
풀이
여러 정점 중 두 정점이 연결될 때 간선의 가중치가 최소가 되는 값을 구하는 것이므로 기본적인 다익스트라 알고리즘을 사용해 풀 수 있다. 다익스트라 알고리즘에 대해 잘 모른다면 아래 링크를 통해 알아보자.
코드
#include <bits/stdc++.h>
using namespace std;
#define INF 2147483647
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, m, s, t;
cin >> n >> m;
// 간선
vector<pair<int, int>> graph[5001]; // [정점][다음 정점, 거리]
while (m--) {
int a, b, c;
cin >> a >> b >> c;
graph[a].push_back({b, c});
graph[b].push_back({a, c});
}
// 출발 도착
cin >> s >> t;
// 다익스트라
vector<int> dist(5001, INF), visited(5001, 0);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
dist[s] = 0; // 시작점 거리 0
pq.push({0, s}); // 시작점만 pq에 추가
while (!pq.empty()) { // pq가 비면 종료
int curr;
do {
curr = pq.top().second;
pq.pop();
} while (!pq.empty() && visited[curr]); // curr이 방문한 정점이면 무시
// 더 이상 방문할 수 있는 정점이 없으면 종료
if (visited[curr])
break;
visited[curr] = 1; // 방문처리
for (auto &p : graph[curr]) {
int next = p.first, d = p.second;
// 거리가 갱신될 경우 pq에 추가
if (dist[next] > dist[curr] + d) {
dist[next] = dist[curr] + d;
pq.push({dist[next], next});
}
}
}
// 도착점까지 최단 거리
cout << dist[t] << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 2307 도로검문 (0) | 2023.02.21 |
---|---|
[백준 / BOJ] C++ 1545 안티 팰린드롬 (0) | 2023.02.21 |
[백준 / BOJ] C++ 27497 알파벳 블록 (0) | 2023.02.20 |
[백준 / BOJ] C++ 27496 발머의 피크 이론 (0) | 2023.02.20 |
[백준 / BOJ] C++ 27495 만다라트 만들기 (0) | 2023.02.20 |