오늘의 알고리즘
[C++] 백준 11779 최소비용 구하기 2
하늘하늘 .
2022. 10. 28. 01:24
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
int N = 0;
int M = 0;
int iFirst = 0;
int iSecond = 0;
int iLong = 0;
int route[1001] = {};
int visit[1001] = {};
std::vector<std::pair<int,int>> vec[1001] = {};
std::vector<int> vecAns = {};
void Dijkstra(int iStart)
{
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, iStart });
visit[iStart] = 0;
while (!pri_que.empty())
{
int iCost = pri_que.top().first;
int iNow = pri_que.top().second;
pri_que.pop();
if (iCost > visit[iNow])
continue;
for (int i = 0; i < vec[iNow].size(); ++i)
{
int iNextCost = vec[iNow][i].second;
int iNext = vec[iNow][i].first;
if (visit[iNext] > visit[iNow] + iNextCost)
{
route[iNext] = iNow;
visit[iNext] = visit[iNow] + iNextCost;
pri_que.push({ visit[iNext], iNext });
}
}
}
}
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cin >> N >> M;
for (int i = 0; i < M; ++i)
{
std::cin >> iFirst >> iSecond >> iLong;
vec[iFirst].push_back({iSecond, iLong});
}
for (int i = 1; i <= N; ++i)
{
visit[i] = 2147483647;
}
std::cin >> iFirst >> iSecond;
Dijkstra(iFirst);
std::cout << visit[iSecond] << "\n";
int iEnd = iSecond;
while (iEnd)
{
vecAns.push_back(iEnd);
iEnd = route[iEnd];
}
std::cout << vecAns.size() << "\n";
for (int i = vecAns.size() - 1; i >= 0; --i)
{
std::cout << vecAns[i] << " ";
}
std::cout << "\n";
return 0;
}
다익스트라자 문제입니다.
기존 거리구하는 건 다익스트라자로 풀면서 경로를 구해야했습니다.
경로는 변경될 때마다 이전 경로를 입력해서 마지막 경로를 찾아낼 수 있도록 연결해줬습니다.
함수 내에서 Cost가 넘어갈 때는 continue를 해주지 않는다면 무조건 시간초과가 나왔습니다.
이 점은 이전에 모두 넣어둔 것들을 빼내야 하기 때문에 해야했습니다.