-
너비 우선 탐색을 통한 최단거리 구해보기알고리즘 이론/알고리즘 구현 2019. 9. 3. 02:47
너비 우선 탐색(BFS) 은 그래프에서의 최단 경로 문제를 푸는 용도로 사용 된다. 최단 경로 문제는 두 정점을 연결하는 경로 중 가장 길이가 짧은 경로를 찾
는문제 이다.
코드 ( C ++ )
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
vector<vector<int>> adj;
// start에서 시작해 그래프를 너비 우선 탐색하고 시작점부터 각 정점까지
// 최단 거리와 너비 우선 탐색 스패닝 트리 계산
// distance[i] = start부터 i까지의 최단 거리
// parnet[i] = 너비 우선 탐색 스패닝 트리에서 i 의 부모의 번호, 루트일 경우 자신의 번호
void bfs2(int start, vector<int>& distance, vector<int>& parent)
{
distance = vector<int>(adj.size(), -1);
parent = vector<int>(adj.size(), -1);
queue<int> q;
distance[start] = 0;
parent[start] = start;
q.push(start);
while (!q.empty())
{
int here = q.front();
q.pop();
for (int i = 0; i < adj[here].size(); ++i)
{
int there = adj[here][i];
if (distance[there] == -1) {
distance[there] = distance[here] + 1;
parent[there] = here;
q.push(there);
}
}
}
}
vector<int> shortestPath(int v, const vector<int>& parent)
{
vector<int> path(1, v);
while (parent[v] != v)
{
v = parent[v];
path.push_back(v);
}
reverse(path.begin(), path.end());
return path;
}
int main()
{
//정점의 수
int V = 9;
adj = vector<vector<int>>(V, vector<int>());
adj[0].push_back(1);
adj[0].push_back(3);
adj[0].push_back(4);
adj[0].push_back(8);
adj[1].push_back(0);
adj[1].push_back(2);
adj[1].push_back(3);
adj[2].push_back(1);
adj[2].push_back(5);
adj[2].push_back(6);
adj[3].push_back(0);
adj[3].push_back(1);
adj[3].push_back(6);
adj[4].push_back(5);
adj[4].push_back(0);
adj[5].push_back(4);
adj[5].push_back(2);
adj[6].push_back(2);
adj[6].push_back(3);
adj[6].push_back(7);
adj[7].push_back(6);
adj[8].push_back(0);
vector<int> distance;
vector<int> parent;
bfs2(0, distance, parent);
vector<int> shortestWay;
// 7로 부터 시작점까지의 최단 경로 계산
shortestWay = shortestPath(7, parent);
// 방문 순서
for (int i = 0; i < shortestWay.size(); ++i)
cout << shortestWay[i] << " ";
return 0;
}
참고 문헌: 알고리즘 해결 전략
'알고리즘 이론 > 알고리즘 구현' 카테고리의 다른 글
그래프의 너비 우선 탐색 (0) 2019.09.03 오일러 서킷을 찾아내는 알고리즘 (0) 2019.08.28 그래프의 깊이 우선 탐색 (0) 2019.08.25 크루스칼의 최소 스패닝 트리 알고리즘 (0) 2019.08.23 플로이드 알고리즘 (0) 2019.08.18