알고리즘/BOJ

백준 1504번 특정한 최단 경로

꾸준함. 2018. 11. 24. 17:10

문제 링크입니다: https://www.acmicpc.net/problem/1504


V1과 V2를 꼭 지나야하므로 아래와 같은 두 가지 경우를 고려해야합니다.

1. 1 -> V1 -> V2 -> N

2. 1 -> V2 -> V1 -> N


따라서, 다익스트라 알고리즘을 1, V1, V2에 대해 전부 수행한 뒤 1번과 2번 중 최소인 경우를 출력합니다.

또한, 경로가 존재하지 않는 경우 -1을 출력해야하는데 987654321을 3번 더해주면 int 오버플로우가 발생하므로 answer가 INF 이상이거나 0 미만일 때 -1을 출력하도록 처리해줘야합니다.


#include <iostream>

#include <vector>

#include <queue>

#include <stack>

#include <functional>

#include <algorithm>

using namespace std;

 

const int MAX = 800 + 1;

const int INF = 987654321;

 

int N, M;

int trace[MAX]; //경로 파악 위해

vector<pair<int, int>> graph[MAX];

 

vector<int> dijkstra(int start, int vertex)

{

        vector<int> distance(vertex, INF);

        distance[start] = 0;

 

        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

        pq.push({ 0, start });

 

        while (!pq.empty())

        {

                 int cost = pq.top().first;

                 int cur = pq.top().second;

                 pq.pop();

 

                 if (distance[cur] < cost)

                         continue;

 

                 for (int i = 0; i < graph[cur].size(); i++)

                 {

                         int neighbor = graph[cur][i].first;

                         int neighborDistance = cost + graph[cur][i].second;

 

                         //업데이트할 때마다 trace도 업데이트

                         if (distance[neighbor] > neighborDistance)

                         {

                                 distance[neighbor] = neighborDistance;

                                 trace[neighbor] = cur;

                                 pq.push({ neighborDistance, neighbor });

                         }

                 }

        }

        return distance;

}

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        cin >> N >> M;

 

        N++;

 

        for (int i = 0; i < M; i++)

        {

                 int u, v, w;

                 cin >> u >> v >> w;

 

                 //양방향

                 graph[u].push_back({ v, w });

                 graph[v].push_back({ u, w });

        }

       

        int node1, node2;

        cin >> node1 >> node2;

 

        vector<int> result = dijkstra(1, N);

        vector<int> temp1 = dijkstra(node1, N);

        vector<int> temp2 = dijkstra(node2, N);

        //두 가지 경우

        //1. 1 -> node1 -> node2 -> N

        //2. 1 -> node2 -> node1 -> N

        int answer = min({ result[node1] + temp1[node2] + temp2[N - 1], result[node2] + temp2[node1] + temp1[N - 1] });

        if (answer >= INF || answer < 0)

                 cout << -1 << "\n";

        else

                 cout << answer << "\n";

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 11279번 최대 힙  (0) 2018.11.24
백준 1927번 최소 힙  (0) 2018.11.24
백준 11779번 최소비용 구하기 2  (2) 2018.11.24
백준 2887번 행성 터널  (0) 2018.11.24
백준 1197번 최소 스패닝 트리  (0) 2018.11.24