[ C++ 백준 1504 ] 특정한 최단 경로
2024. 5. 11. 16:00ㆍ알고리즘/백준 문제풀이
다익스트라를 복습하기 위해서 문제를 풀어보았다.
사실 이렇게 해서 풀릴 줄 몰랐는데
그냥 다익스트라를 여러 번 돌려서 해결되었다.
정점 2개를 무조건 지나가야 하기 때문에
시작 지점, 정점1, 정점2에서 다익스트라를 이용해 한 번씩 돌려 거리 값을 구하고
최소 거리를 계산하는 방식으로 해결했다.
#include <iostream>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
int INF = 98765432;
long NodeDist[801];
vector<pair<int, int>> Nodes[801];
int N, E;
void BFS(int start)
{
memset(NodeDist, INF, sizeof(NodeDist));
NodeDist[start] = 0;
queue<int> q;
q.push(start);
while (!q.empty())
{
int from = q.front();
q.pop();
for (int i = 0; i < Nodes[from].size(); ++i)
{
int to = Nodes[from][i].first;
int length = Nodes[from][i].second + NodeDist[from];
if (NodeDist[from] > NodeDist[to])
continue;
if (NodeDist[to] > length )
{
q.push(to);
NodeDist[to] = length;
}
}
}
}
// 데익스트라
int main()
{
cin >> N >> E;
int a, b, c, v1, v2;
for (int i = 0; i < E; ++i)
{
// from 'a' to 'b' = c
cin >> a >> b >> c;
Nodes[a].push_back({b, c});
Nodes[b].push_back({a, c});
}
int answer = 0;
cin >> v1 >> v2;
// BFS
BFS(1);
int from1_to_v1Dist = NodeDist[v1];
int from1_to_v2Dist = NodeDist[v2];
BFS(v1);
int fromv1_to_v2Dist = NodeDist[v2];
int fromv1_to_endDist = NodeDist[N];
BFS(v2);
int fromv2_to_v1Dist = NodeDist[v1];
int fromv2_to_endDist = NodeDist[N];
int t1 = (from1_to_v1Dist + fromv1_to_v2Dist + fromv2_to_endDist);
int t2 = (from1_to_v2Dist + fromv2_to_v1Dist + fromv1_to_endDist);
answer = min(t1, t2);
if (answer >= INF)
{
cout << "-1";
return 0;
}
cout << answer;
}
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[ C++ 백준 1101 ] 카드 정리 1 (0) | 2024.05.10 |
---|---|
[ C++ 백준 1062 ] 가르침 (0) | 2024.05.09 |
[ C++ 백준 1149 ] RGB거리 (0) | 2024.05.08 |
[ C++ 백준 1167, 1967 ] 트리의 지름, 트리의 지름 (0) | 2024.05.07 |
[ C++ 백준 9328 ] 열쇠 (0) | 2023.11.15 |