그래프(Graph)
요소들이 서로 복잡하게 연결되어 있는 관계를 표현하는 자료구조이다.
그래프의 구성
정점(Vertex)
여러 가지 특성을 가질 수 있는 객체, 노드(Node)라고도 부른다.
간선(Edge)
이러한 객체 정점들 간의 관계를 의미, 링크(Link)라고도 부른다.
그래프의 종류
무방향 그래프(Undirected Graph)
간선에 방향이 표시되지 않는 그래프
방향 그래프(Directed Graph)
간선에 방향성이 존재하는 그래프
가중치 그래프(Weighted Graph)
간선에 비용이나 가중치가 할당된 그래프
부분 그래프(Subgraph)
부분 집합으로 이루어진 그래프
그래프의 용어
인접 정점(Adjacent Vertex)
정점의 차수(Degree)
경로(Path)
경로의 길이
단순경로(Simple Path)
사이클(Cycle)
연결 그래프(Connected Graph)
비연결 그래프(Unconnected Graph)
트리(Tree)
완전 그래프(Complete Graph)
그래프의 추상 자료형
데이터
정점의 집합과 간선의 집합
연산
init(): 초기화
isEmpty(): 그래프가 비어있는지 확인
insertVertex(): 정점 삽입
insertEdge(): 간선 삽입
deleteVertex(): 정점 삭제
deleteEdge(): 간선 삭제
adjacent(v): 정점 v에 인접한 모든 정점의 집합을 반환
그래프의 구현 방법
인접 행렬을 통한 그래프의 구현
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX 256
typedef char VertexData;
int adj[MAX_VERTEX][MAX_VERTEX];
int vsize;
VertexData vdata[MAX_VERTEX];
int isEmpty() { return vsize == 0; }
int isFull() { return vsize >= MAX_VERTEX; }
void init() {
vsize = 0;
for (int i = 0; i < MAX_VERTEX; i++) {
for (int j = 0; j < MAX_VERTEX; j++) {
adj[i][j] = 0;
}
}
}
void insert(VertexData data) {
if (isFull())
printf("그래프가 가득차있습니다.\n");
else
vdata[vsize++] = data;
}
void insert_DirectionalEdge(int u, int v, int value) {
adj[u][v] = value;
}
void insert_UnDirectionalEdge(int u, int v, int value) {
adj[u][v] = adj[v][u] = value;
}
삭제 추가 예정
인접 리스트를 통한 그래프의 구현
그래프의 탐색
깊이 우선 탐색(DFS: Depth First Search)
시작 정점으로부터 임의의 인접한 정점으로 최대한 깊숙히 탐색하고 다시 되돌아가며 방문하지 않은 인접한 정점으로 탐색하는 순회 방법이다.
시작 정점에서 임의의 인접한 정점으로 탐색을 진행하며 방문한 정점은 방문되었다는 표시를 남기고 아직 방문하지 않은 인접한 정점으로 탐색을 계속한다. 만약 방문하지 않은 인접한 정점이 없다면 가장 마지막에 남았던 정점으로 돌아가고 이를 시작 정점까지 반복한다.
void DFS(int v) {
visited[v] = 1;
for (int i = 0; i < vsize; i++) {
if (adj[v][i] != 0 && visited[i] == 0)
DFS(i);
}
}
너비 우선 탐색(BFS: Breadth First Search)
시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다.
시작 정점의 인접 정점들을 방문하며 저장하고 더 이상 인접 정점이 없을 시 저장된 정점을 삽입된 순서대로 꺼내어 그 정점과 인접한 정점들을 차례대로 방문하는 것을 반복한다.
void BFS(int v) {
visited[v] = 1;
init_queue();
enqueue(v);
while (!isEmpty()) {
v = dequeue();
for (int i = 0; i < vsize; i++) {
if (adj[v][i] != 0 && visited[i] == 0) {
visited[i] = 1;
enqueue(i);
}
}
}
}
'개인 공부 > 자료구조' 카테고리의 다른 글
이진탐색트리(Binary Search Tree)(임시) (0) | 2023.02.02 |
---|---|
탐색(Search) (0) | 2023.02.02 |
우선순위 큐(Priority Queue), 힙(Heap) (2) | 2023.01.25 |
정렬(Sorting)#1 (0) | 2023.01.18 |
트리(Tree) (0) | 2023.01.04 |