[1504] 특정한 최단 경로
문제
특정한 조건 하에 1번 정점에서 N번 정점까지의 최단 거리를 구하는 문제이다. 이 문제에서 주어진 특정한 조건은 임의로 주어진 점 v1,v2를 반드시 통과한다는 것이다.
해결
정점의 최단 거리를 구하는 알고리즘은
1. 다익스트라 알고리즘
2. 벨만포드 알고리즘
3. 플로이드-와샬 알고리즘이 있다.
이 중에서 우선순위 큐를 이용하여 가장 빠르게 구할 수 있는 다익스트라 알고리즘을 사용해서 구할 것이다.
임의로 주어진 점 v1,v2를 반드시 통과하는 최단거리를 구하기 위해서는
1 -> v1 -> v2 -> N
1 -> v2 -> v1 -> N
두 가지 경우 중 하나일 것이다.
내가 푼 방식은
v1->v2 와 v2->v1의 거리는 같기 때문에
총 5번의 다익스트라 알고리즘을 통하여 답을 도출했다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const long INF = 10000000000;
int N, E;
int v1, v2;
vector<pair<long long, long long>> vec[801];
long long dijkstra(int start, int end)
{
	long long dis[801];
	for (int i = 1; i <= N; i++) dis[i] = INF;
	priority_queue<pair<long long, long long>> pq;
	pq.push(make_pair(0, start));
	dis[start] = 0;
	while (!pq.empty()) {
		long long curTime = -pq.top().first;
		int cur = pq.top().second;
		pq.pop();
		for (int i = 0; i < vec[cur].size(); i++) {
			long long nextTime = vec[cur][i].second;
			int next = vec[cur][i].first;
			if (dis[next] > nextTime + curTime) {
				dis[next] = nextTime + curTime;
				pq.push(make_pair(-dis[next], next));
			}
		}
	}
	return dis[end];
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> N >> E;
	for (int i = 0; i < E; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		vec[a].push_back(make_pair(b, c));
		vec[b].push_back(make_pair(a, c));
	}
	cin >> v1 >> v2;
	long long common = dijkstra(v1, v2);
	long long route1 = dijkstra(1, v1) + dijkstra(v2, N);
	
	long long route2 = dijkstra(1, v2) + dijkstra(v1, N);
	long long answer = min(route1, route2);
	if (answer == INF || answer + common == INF) cout << "-1" << '\n';
	else cout << answer+common << '\n';
}
피드백
- 
답을 도출하는 과정에서 몇 번의 오류가 있었다.
- 자료형을 제대로 판별하지 않았다. (최대 long long 값이 나올 수 있는 것을 간과했다)
 - v1는 1이고 v2는 N인 경우를 간과했다.
 
 - 
최적화
- 
다익스트라 알고리즘에 대해 다시 생각해보자
 - 
다익스트라 알고리즘을 통해 알 수 있는 것
=> 시작점에서의 각 정점까지의 최단거리 - 
총 5번의 다익스트라 알고리즘이 필요했을까?
 - 
1->v1,v2 / v1-> v2,N / v2 -> N 으로 총 3번의 다익스트라 알고리즘을 통해 구할 수 도 있었을 것이다.
 
 - 
 
Author And Source
이 문제에 관하여([1504] 특정한 최단 경로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rnska96/1504-특정한-최단-경로저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)