Def) 그래프(Graph)
- 개체 간의 연결 관계를 표현할 수 있는 비선형 자료구조
- ex. 도시들 간의 연결, 지하철 노선도, SNS 친구 관계도 등
Note) 그래프의 구성 요소
- 그래프 G = (V, E)
- 정점 V(Vertex, Node)
그래프를 구성하는 기본 단위. 노드.
데이터를 저장하거나 상태를 표현
- 엣지 E(Edge, Link)
정점과 정점을 잇는 선. 간선.
방향을 가질 수도 있음.
가중치(Weight)를 가질 수도 있음.
Note) 그래프 관련 용어
| 가중치(Weight) | 엣지에 부여된 수치. 비용(Cost) | 
| 인접 정점(Adjacent Vertex) | 엣지로 연결되어 있는 정점 | 
| 차수(Degree) | 정점에 연결된 다른 정점의 개수 | 
| 경로(Path) | - 특정 정점에서 다른 정점으로 이동하는 방법을  인접 정점의 나열로 표현한 것. - 경로 상에 특정 정점이 중복되지 않는 경로를 단순 경로(Simple Path)라 함.  | 
| 사이클(Cycle) | 시작 정점과 마지막 정점이 같은 단순 경로. 즉, 트리는 사이클이 없는 그래프라 할 수 있음.  | 
| 방향 그래프(Directed Graph) | - 엣지에 방향이 있는 그래프. == 유향 그래프, 네트워크(Network) - 방향 그래프에서 엣지(u, v)는 정점 u에서 정점 v로 이동하는 엣지를 나타냄. 단, (u, v) != (v, u)  | 
| 가중치 그래프(Weighted Graph) | 엣지에 가중치가 부여되어 있는 그래프 | 
| 서브 그래프(Sub-Graph) | 주어진 그래프에서 정점과 간선 일부를 제외하여 만든 그래프. 부분 그래프.  | 
Def) 인접 행렬
- 정점 갯수가 N인 경우, N by N 크기의 2차원 행렬로
정점의 인접 관계를 표현하는 방법
- adj[u][v]: 노드 u에서 노드 v로 가는 간선이 있다면 1, 없다면 0
- 그래프 정점 개수가 적고, 엣지가 많을 때 유리.
정점 개수가 많을 수록, 엣지가 적을수록 공간이 낭비되게 됨.
공간 복잡도는 O(N^2)
Ex) 무방향 그래프의 인접 행렬
무방향 그래프의 경우, 대각원소를 기준으로
서로 대칭인 형태의 인접 행렬이 만들어짐.
<hide/>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALIED_INDEX = -1,
    MAX_COUNT = 101	
};
int g_nAdjMatrix[MAX_COUNT][MAX_COUNT] = { 0, };
int g_nVisitMatrix[MAX_COUNT] = { 0, };
size_t g_uVertexCount, g_uEdgeCount, g_uStartVertex = 1;
int main(void)
{
    size_t i, j, uVertex1, uVertex2;
    scanf("%zu %zu", &g_uVertexCount, &g_uEdgeCount);
    for (i = 1; i <= g_uEdgeCount; ++i)
    {
        scanf("%zu %zu", &uVertex1, &uVertex2);
        g_nAdjMatrix[uVertex1][uVertex2] = TRUE;
        g_nAdjMatrix[uVertex2][uVertex1] = TRUE;
    }
    for (i = 1; i <= g_uVertexCount; ++i)
    {
        for (j = 1; j <= g_uVertexCount; ++j)
        {
            printf("%d ", g_nAdjMatrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
Ex) 방향 그래프의 인접 행렬
방향 그래프의 경우, 특정 정점에서 다른 정점으로
이동이 가능한 경우에만 1로 표시함.
<hide/>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
enum {
    FALSE = 0,
    TRUE = 1,
    INVALIED_INDEX = -1,
    MAX_COUNT = 101
};
int g_nAdjMatrix[MAX_COUNT][MAX_COUNT] = { 0, };
int g_nVisitMatrix[MAX_COUNT] = {0,};
size_t g_uVertexCount, g_uEdgeCount, g_uStartVertex = 1;
int main(void)
{
    size_t i, j, uVertex1, uVertex2;
    scanf("%zu %zu", &g_uVertexCount, &g_uEdgeCount);
    for (i = 1; i <= g_uEdgeCount; ++i)
    {
        scanf("%zu %zu", &uVertex1, &uVertex2);
        g_nAdjMatrix[uVertex1][uVertex2] = TRUE;
    }
    for (i = 1; i <= g_uVertexCount; ++i)
    {
        for (j = 1; j <= g_uVertexCount; ++j)
        {
            printf("%d ", g_nAdjMatrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}
Ex) 가중치 무방향 그래프의 인접 행렬
가중치 무방향 그래프의 경우, 이동이 가능한 경우에는
가중치를 저장하고, 불가능한 경우에는 극한값을 저장함.
<hide/>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
enum {
    ...
};
int main(void)
{
    int adjMatrix[MAX_COUNT][MAX_COUNT] = {0,};
    size_t i, j, uVertexCount, uEdgeCount, uVertex1, uVertex2, uWeight;
    scanf("%zu %zu", &uVertexCount, &uEdgeCount);
    for (i = 1; i <= uVertexCount; ++i)
    {
        for (j = 1; j <= uVertexCount; ++j)
        {
            adjMatrix[i][j] = INT_MAX;
        }
    }
    for (i = 1; i <= uEdgeCount; ++i)
    {
        scanf("%zu %zu %zu", &uVertex1, &uVertex2, &uWeight);
        adjMatrix[uVertex1][uVertex2] = uWeight;
        adjMatrix[uVertex2][uVertex1] = uWeight;
    }
    for (i = 1; i <= uVertexCount; ++i)
    {
        for (j = 1; j <= uVertexCount; ++j)
        {
            if (INT_MAX == adjMatrix[i][j])
            {
                printf("INT_MAX ");
            }
            else
            {
                printf("%7d ", adjMatrix[i][j]);
            }
            
        }
        printf("\n");
    }	
    return 0;
}
Def) 인접 리스트
- 각 정점에 인접한 정점들을 연결 리스트로 구현하는 방법
- 보통 정점 개수에 해당하는 배열의 각 원소에
연결 리스트가 속해 있는 형태로 구현
- 정점 갯수가 N이고, 엣지 갯수가 M일 때,
공간 복잡도는 O(N + M).
Note) 무방향 그래프와 방향 그래프의 인접 리스트
- 무방향 그래프의 경우, 공간 복잡도는 O(2M)
- 방향 그래프의 경우, 공간 복잡도는 O(M)
Def) 엣지 리스트
- 모든 엣지 (u, v)를 연결 리스트 또는 배열로 구현하는 방법
- 엣지의 개수가 M일 때, 공간 복잡도는 O(M)
'C > 자료구조와 알고리듬' 카테고리의 다른 글
| Chapter 15. BFS (0) | 2021.12.02 | 
|---|---|
| Chapter 14. DFS (0) | 2021.11.28 | 
| Chapter 12. 힙(Heap) (0) | 2021.11.25 | 
| Chapter 11. 이진 탐색 트리(Binary Search Tree) (0) | 2021.11.21 | 
| Chapter 10. 트리(Tree) (0) | 2021.11.19 | 
댓글