티스토리 뷰
✏️ 문제 링크
https://www.acmicpc.net/problem/1504
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
✏️ 문제 설명
✏️ 문제 풀이
다익스트라 알고리즘을 적용시켜서 풀었습니다.
다만 두 정점을 거쳐가야 하는 최단경로를 출력해야 하므로 다음과 같은 경우의 수로 나뉘었습니다.
두 정점을 A,B라 하고 시작점을1, 도착점을 N이라고 하면
● 1 -> A -> B -> N
● 1 -> B -> A -> N
● 1 -> B -> A -> B -> N (A에서 N으로 가는 경로가 없을 때)
● 1 -> A -> B -> A -> N ( B에서 N으로 가는 경로가 없을 때)
이렇게 되면 다익스트라를 총 3번 돌려야 합니다.
1을 출발점으로 다익스트라 돌리기 : 1->A의 최단경로와 1->B의 최단경로값을 알 수 있습니다.
N을 출발점으로 다익스트라 돌리기 : N->A의 최단경로와 N->B의 최단경로값을 알 수 있습니다.
A를 출발점으로 다익스트라 돌리기 : A->B의 최단경로를 알 수 있습니다.
✏️ 문제 코드
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include<limits.h>
using namespace std;
#define INF INT_MAX
typedef pair<int, int> cur;
priority_queue <cur, vector<cur>, greater<cur>> pq;
vector<vector<cur>> V(801);
vector<int> Res(801), Visit(801);
int N, M, A, B, C, i, idx, tmp, a, b, c, d, e;
int Ans;
bool Chk1, Chk2 , Chk3;
void Dijkstra(int start) {
fill(Res.begin(), Res.end(), INF);
fill(Visit.begin(), Visit.end(), 0);
Res[start] = 0;
pq.push({ 0,start });
while (!pq.empty()) {
idx = pq.top().second;
pq.pop();
if (Visit[idx]) continue;
else Visit[idx]++;
for (i = 0; i < V[idx].size(); i++) {
C = V[idx][i].first;
if (!Visit[C]) {
tmp = Res[idx] + V[idx][i].second;
if (tmp < Res[C]) {
Res[C] = tmp;
pq.push({ Res[C],C });
}
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
for (int i = 0; i < M; i++) {
cin >> A >> B >> C;
V[A].push_back({ B,C });
V[B].push_back({ A,C });
}
cin >> A >> B;
Dijkstra(1);
if (Res[A] == INF && Res[B] == INF)
Chk1 = true;
a = Res[A]; b = Res[B];
Dijkstra(N);
if (Res[A] == INF && Res[B] == INF)
Chk2 = true;
d = Res[A]; e = Res[B];
Dijkstra(A);
if (Res[B] == INF)
Chk3 = true;
c = Res[B];
Ans = min(min(a + c + e, b + c + d), min(a + c + c + d, a + c + c + e));
if (Chk1 || Chk2 || Chk3)
Ans = -1;
cout << Ans;
}
✏️ 참고하기
https://pooreumjung.tistory.com/299
Algorithm 공부 #16 - 그래프(다익스트라 알고리즘)
Algorithm 공부 #16 - 그래프(다익스트라 알고리즘) 다익스트라 알고리즘(Dijkstra Algorithm) ● 그래프에서 최단거리를 구하는 알고리즘 ● 출발 노드와 모든 노드 간의 최단 거리 탐색 ● 시간 복잡도 O
pooreumjung.tistory.com
'Algorithm > BOJ' 카테고리의 다른 글
[C/C++] 백준 1865번 - 웜홀 (0) | 2024.04.04 |
---|---|
[C/C++] 백준 14284번 간선 이어가기 2 (0) | 2024.04.03 |
[C/C++] 백준 25168번 - 게으른 아리를 위한 접종 계획 (0) | 2024.04.02 |
[C/C++] 백준 1766번 - 문제집 (0) | 2024.04.02 |
[C/C++] 백준 2056번 - 작업 (0) | 2024.04.02 |
- Total
- Today
- Yesterday
- DFS
- 자바스크립트
- 백준
- c++ string
- 카운팅 정렬
- 자바
- BFS
- 자료구조
- Do it!
- 투 포인터
- html
- 유클리드 호제법
- 알고리즘 공부
- C++ Stack
- 스프링 부트 crud 게시판 구현
- java
- 우선순위 큐
- DP
- 스택
- 알고리즘
- js
- 백준 풀이
- 이분 매칭
- 에라토스테네스의 체
- 유니온 파인드
- HTML5
- 반복문
- CSS
- C++
- 세그먼트 트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |