dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 회고
  • 부스트캠프
  • Hackerrank
  • 백준 DP
  • 스프링
  • c++
  • AI Tech
  • Baekjoon
  • 그래프탐색
  • 백준
  • 프로그래머스 SQL
  • 일기
  • 기록
  • 서블릿
  • BFS
  • 반성
  • 프로그래머스
  • HackerRank mysql
  • dp
  • 네이버 부스트캠프

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 1504] 특정한 최단 경로 (다익스트라) (C++)

2021. 3. 28. 15:05
728x90

www.acmicpc.net/problem/1504

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

1번부터 N번까지 갈 수 있는 최단 경로 중 주어진 두 점을 지나는 최단 경로를 출력한다.

 

가중치 있는 그래프이므로 다익스트라를 이용하고, 나올 수 있는 최단경로의 경우는

1. 시작점 1 -> 주어진 점 a -> 주어진 점 b -> 끝점 n

2. 시작점 1 -> 주어진 점 b -> 주어진 점 a -> 끝점 n

이다.

 

즉, 다익스트라를 3번 이용해서 각각의 경우에 해당하는 최단 경로를 계산해서 더해주면 된다.

또는, 경로가 없다면 -1을 출력한다.

 

다익스트라(1 -> a) + 다익스트라(a -> b) + 다익스트라(b -> n)와

다익스트라(1 -> b) + 다익스트라(b -> a) + 다익스트라(a -> n) 중 최솟값이다.

 

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

#define INF 987654321

using namespace std;

int n, e, dist[801][3], from, to, dis, mustfrom, mustto;
vector<pair<int, int>> v[801];
priority_queue < pair<int, int>, vector<pair<int, int>>, greater< pair<int, int>>> pq;

void BFS(int start, int idx) {
	pq.push(make_pair(start, 0));
	dist[start][idx] = 0;

	while (!pq.empty()) {
		int now = pq.top().first;
		int now_dist = pq.top().second;
		pq.pop();

		for (int i = 0; i < v[now].size(); i++) {
			int next = v[now][i].first;
			int next_dist = v[now][i].second;

			if (dist[next][idx] > dist[now][idx] + next_dist) {
				dist[next][idx] = dist[now][idx] + next_dist;
				pq.push(make_pair(next, dist[next][idx]));
			}
		}
	}
}


int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> e;
	for (int i = 0; i < e; i++) {
		cin >> from >> to >> dis;
		v[from].push_back(make_pair(to, dis));
		v[to].push_back(make_pair(from, dis));
	}
	cin >> mustfrom >> mustto;

	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < 3; j++) {
			dist[i][j] = INF;
		}
	}

	BFS(1, 0);

	BFS(mustfrom, 1);

	BFS(mustto, 2);

	int ans1 = 0;
	int ans2 = 0;

	if (dist[mustfrom][0] == INF || dist[mustto][1] == INF || dist[n][2] == INF)
		ans1 = -1;
	else
		ans1 = dist[mustfrom][0] + dist[mustto][1] + dist[n][2]; // 1 -> 2 -> 3-> 4

	if (dist[mustfrom][1] == INF || dist[mustto][0] == INF || dist[n][2] == INF)
		ans2 = -1;
	else
		ans2 = dist[mustto][0] + dist[mustfrom][2] + dist[n][1]; //1->3->2->4

	if (ans1 != -1 && ans2 != -1)
		cout << min(ans1, ans2);
	else if (ans1 == -1 && ans2 != -1)
		cout << ans2;
	else if (ans1 != -1 && ans2 == -1)
		cout << ans1;
	else
		cout << -1;
}

다익스트라를 3번 해야 하기 때문에 최단 거리를 저장하는 배열을 dist [801][3]으로 선언했다.

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 1937] 욕심쟁이 판다 (DFS+DP) (C++)  (0) 2021.04.04
[baekjoon 11404] 플로이드 (플로이드-와샬) (C++)  (0) 2021.03.28
[baekjoon 2589] 보물섬 (BFS, 브루트포스) (C++)  (0) 2021.03.25
[baekjoon 20040] 사이클 게임 (유니온 파인드, union-find) (C++)  (0) 2021.03.21
[baekjoon 2749] 피보나치 수 3 (DP, 피사노 주기) (C++)  (0) 2021.02.25
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 1937] 욕심쟁이 판다 (DFS+DP) (C++)
    • [baekjoon 11404] 플로이드 (플로이드-와샬) (C++)
    • [baekjoon 2589] 보물섬 (BFS, 브루트포스) (C++)
    • [baekjoon 20040] 사이클 게임 (유니온 파인드, union-find) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바