오늘의 알고리즘

[C++] 백준 1504 특정한 최단 경로

하늘하늘 . 2022. 10. 2. 00:31
#include <iostream>
#include <vector>
#include <queue>
#include <string.h>
 
int N = 0;
std::vector<std::pair<int, int>> vecPair[801];
int visit[801] = {};
int iMin = 100000000;
 
void Dijkstra(int iNow)
{
    for (int i = 1; i <= N; i++)
    {
        visit[i] = 100000000;
    }
 
    visit[iNow] = 0;
 
    std::priority_queue<std::pair<int, int>, 
        std::vector<std::pair<int, int>>, 
        std::greater<std::pair<int, int>>> pri_que = {};
 
    pri_que.push({ 0, iNow });
 
    while (!pri_que.empty()) 
    {
        int iDist = pri_que.top().first;
        int iX = pri_que.top().second;
        pri_que.pop();
 
        for (int i = 0; i < vecPair[iX].size(); ++i)
        {
            int iNextX = vecPair[iX][i].first;
            int iNextDist = vecPair[iX][i].second;
 
            if (visit[iNextX] > iDist + iNextDist)
            {
                visit[iNextX] = iDist + iNextDist;
                pri_que.push({ visit[iNextX],iNextX });
            }
        }
    }
}
 
int main()
{
    int E = 0;
    std::cin >> N >> E;
 
    int iStart = 0;
    int iEnd = 0;
    int iDist = 0;
 
    for (int i = 0; i < E; ++i)
    {
        std::cin >> iStart >> iEnd >> iDist;
 
        vecPair[iStart].push_back({ iEnd, iDist });
        vecPair[iEnd].push_back({ iStart, iDist });
    }
 
    std::cin >> iStart >> iEnd;
 
    Dijkstra(1);
    int iOneStart = visit[iStart];
    int iOneEnd = visit[iEnd];
 
    Dijkstra(iStart);
    int iStartEnd = visit[iEnd];
    int iStartN = visit[N];
 
    Dijkstra(iEnd);
    int iEndN = visit[N];
 
 
    if (iStartEnd == 100000000 || 
        iOneStart == 100000000 || 
        iOneEnd == 100000000 ||
        iStartN == 100000000)
    {
        std::cout << -1;
    }
 
    else
    {
        std::cout << std::min(iOneStart + iStartEnd + iEndN, iOneEnd + iStartEnd + iStartN);
    }
 
    return 0;
}
 

처음에는 BFS로 풀 수 있을 줄 알았습니다.

시작 -> 2 -> 3 -> N으로 풀면 될까 싶었는데 시간초과...

다익스트라자를 이용해서 최단거리 경로를 구해서 풀었습니다.

한 점에서 어떠한 위치에 얼마나 가볍게 갈 수 있는가에 대한 값이 가장 중요합니다.