그래프는 여러 개의 노드(node/vertices)와 노드가 간선(edge)로 이루어진 형태의 자료구조이다. 노드와 간선으로 이루어진 것은 트리와 흡사하지만 트리와는 다르게 순환이 가능하며 트리처럼 루트에서 시작하는 것이 아닌 딱히 시작점이 정해져 있지 않다. 그래프를 연결하는 간선이 방향이 있거나 가중치가 있는 등 다양한 방식으로 구현이 가능하다.
그래프를 구현하는 방법은 인접 행렬(adjacency matrix)와 인접 리스트(adjacency list)로 두가지 방법이 있다.
또한, 그래프 자료구조를 탐색하는데 주로 BFS와 DFS 알고리즘을 사용한다. BFS 알고리즘은 넓이 우선 탐색이며 한단계 한단계 모든 인접노드를 확인하는 방면 DFS는 깊이 우선 탐색으로 인접한 노드에 연결 된 모든 모드를 끝까지 들어가서 확인하고 나오고를 반복한다.
출처: https://www.geeksforgeeks.org/graph-data-structure-and-algorithms/
//그래프 구현 방식
#include <vector>
int graph[5][5] = {0};
vector<int> a[8];
int main(void){
//인접 행렬 방식
//0과 1를 연결합니다(배열의 위치가 노드의 번호에 해당 되며 저장값이 가중치인 방식)
//해당 예시는 가중치가 없으므로 1과 0으로 연결 돼 있는지만 저장
graph[0][1] = 1;
graph[1][0] = 1;
graph[0][4] = 1;
graph[4][0] = 1;
graph[1][2] = 1;
graph[2][1] = 1;
...
//인접 리스트 방식
//0과 1를 연결합니다(갖고 있는 이웃을 벡터에 저장하는 방식)
a[0].push_back(1);
a[1].push_back(0);
a[0].push_back(4);
a[4].push_back(0);
a[1].push_back(2);
a[2].push_back(1);
...
}
//BFS 구현
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int number = 7;
int c[7];
vector<int> a[8];
void bfs(int start){
queue<int> q;
q.push(start);
c[start] = true;
while(!q.empty()){
int x = q.front();
q.pop();
printf("%d ", x);
for(int i = 0; i < a[x].size(); i++){
int y = a[x][i];
if(!c[y]){
q.push(y);
c[y] = true;
}
}
}
}
//DFS 구현
#include <iostream>
#include <vector>
using namespace std;
int number = 7;
int c[7];
vector<int> a[8];
void dfs(int x){
if(c[x]) return;
c[x] = true;
cout<< x <<' ';
for(int i = 0; i < a[x].size(); i++){
int y = a[x][i];
dfs(y);
}
}