반응형
그래프 (Graph)
그래프는 노드(정점, Vertex)와 간선(Edge)으로 구성된 자료구조로, 여러 노드가 간선으로 연결된 형태를 가집니다. 그래프는 다양한 문제를 모델링하고 해결하는 데 사용됩니다.
그래프의 구성 요소:
- 노드 (Vertex): 그래프의 개별 요소입니다.
- 간선 (Edge): 노드 간의 연결을 나타냅니다.
그래프의 종류:
- 방향 그래프 (Directed Graph): 간선이 방향을 가지는 그래프입니다.
- 무방향 그래프 (Undirected Graph): 간선이 방향을 가지지 않는 그래프입니다.
- 가중치 그래프 (Weighted Graph): 간선에 가중치가 있는 그래프입니다.
- 비가중치 그래프 (Unweighted Graph): 간선에 가중치가 없는 그래프입니다.
그래프의 표현 방법
그래프는 다음과 같은 방법으로 표현할 수 있습니다:
- 인접 행렬 (Adjacency Matrix): 2차원 배열을 사용하여 그래프를 표현합니다.
- 인접 리스트 (Adjacency List): 배열이나 리스트의 리스트를 사용하여 그래프를 표현합니다.
그래프의 표현 예제
인접 행렬 (Adjacency Matrix)
인접 행렬은 2차원 배열을 사용하여 그래프를 표현합니다. 행렬의 각 요소는 노드 간의 연결을 나타내며, 연결이 있으면 1, 없으면 0을 사용합니다. 가중치 그래프의 경우 연결이 있으면 가중치를, 없으면 무한대 값을 사용합니다.
AdjacencyMatrixGraph.h
#ifndef ADJACENCYMATRIXGRAPH_H
#define ADJACENCYMATRIXGRAPH_H
#include <iostream>
#include <vector>
class AdjacencyMatrixGraph {
public:
AdjacencyMatrixGraph(int vertices);
void addEdge(int src, int dest, int weight = 1); // 간선 추가
void display() const; // 그래프 출력
private:
std::vector<std::vector<int>> adjMatrix; // 인접 행렬
int vertices; // 정점의 개수
};
// 생성자 정의
AdjacencyMatrixGraph::AdjacencyMatrixGraph(int vertices)
: vertices(vertices), adjMatrix(vertices, std::vector<int>(vertices, 0)) {}
// 간선 추가 함수 정의
void AdjacencyMatrixGraph::addEdge(int src, int dest, int weight) {
adjMatrix[src][dest] = weight;
}
// 그래프 출력 함수 정의
void AdjacencyMatrixGraph::display() const {
for (int i = 0; i < vertices; ++i) {
for (int j = 0; j < vertices; ++j) {
std::cout << adjMatrix[i][j] << " ";
}
std::cout << std::endl;
}
}
#endif // ADJACENCYMATRIXGRAPH_H
인접 리스트 (Adjacency List)
인접 리스트는 배열이나 리스트의 리스트를 사용하여 그래프를 표현합니다. 각 노드는 연결된 노드의 리스트를 가집니다.
AdjacencyListGraph.h
#ifndef ADJACENCYLISTGRAPH_H
#define ADJACENCYLISTGRAPH_H
#include <iostream>
#include <vector>
#include <list>
class AdjacencyListGraph {
public:
AdjacencyListGraph(int vertices);
void addEdge(int src, int dest); // 간선 추가
void display() const; // 그래프 출력
private:
std::vector<std::list<int>> adjList; // 인접 리스트
int vertices; // 정점의 개수
};
// 생성자 정의
AdjacencyListGraph::AdjacencyListGraph(int vertices)
: vertices(vertices), adjList(vertices) {}
// 간선 추가 함수 정의
void AdjacencyListGraph::addEdge(int src, int dest) {
adjList[src].push_back(dest);
}
// 그래프 출력 함수 정의
void AdjacencyListGraph::display() const {
for (int i = 0; i < vertices; ++i) {
std::cout << i << ": ";
for (int dest : adjList[i]) {
std::cout << dest << " ";
}
std::cout << std::endl;
}
}
#endif // ADJACENCYLISTGRAPH_H
그래프 예제
인접 행렬 그래프 예제
#include <iostream>
#include "AdjacencyMatrixGraph.h"
int main() {
AdjacencyMatrixGraph graph(5);
graph.addEdge(0, 1);
graph.addEdge(0, 4);
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
graph.addEdge(2, 3);
graph.addEdge(3, 4);
std::cout << "인접 행렬 그래프:" << std::endl;
graph.display(); // 그래프 출력
return 0;
}
인접 리스트 그래프 예제
#include <iostream>
#include "AdjacencyListGraph.h"
int main() {
AdjacencyListGraph graph(5);
graph.addEdge(0, 1);
graph.addEdge(0, 4);
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
graph.addEdge(2, 3);
graph.addEdge(3, 4);
std::cout << "인접 리스트 그래프:" << std::endl;
graph.display(); // 그래프 출력
return 0;
}
설명
- 그래프 (Graph):
- 그래프는 노드(정점, Vertex)와 간선(Edge)으로 구성된 자료구조입니다.
- 방향 그래프, 무방향 그래프, 가중치 그래프, 비가중치 그래프 등 다양한 종류가 있습니다.
- 그래프의 표현 방법:
- 인접 행렬 (Adjacency Matrix): 2차원 배열을 사용하여 그래프를 표현합니다. 노드 간의 연결 여부를 행렬의 요소로 나타냅니다.
- 인접 리스트 (Adjacency List): 배열이나 리스트의 리스트를 사용하여 그래프를 표현합니다. 각 노드는 연결된 노드의 리스트를 가집니다.
이제 그래프의 기본 개념과 표현 방법을 이해했습니다. 다음 단계로 넘어가며, 더 복잡한 자료구조와 알고리즘을 학습해보겠습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 12: 그래프 표현 방법 (인접 리스트, 인접 행렬)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++로 배우는 알고리즘과 자료구조 시리즈' 카테고리의 다른 글
[C++로 배우는 알고리즘과 자료구조] Day 13: 이진 힙과 힙 정렬 (0) | 2024.08.01 |
---|---|
[C++로 배우는 알고리즘과 자료구조 ] Day 10: 트라이 (Trie) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 8: 균형 이진 탐색 트리 (AVL 트리) (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 9: 힙과 우선순위 큐 (0) | 2024.08.01 |
[C++로 배우는 알고리즘과 자료구조] Day 7: 이진 탐색 트리 (BST) (0) | 2024.08.01 |