본문 바로가기

코딩 및 기타/어서와! 자료구조와 알고리즘

그래프

728x90

∙ 그래프

- 객체 간의 연결 관계를 표현할 수 있는 비선형 자료 구조

- 쾨니히스베르크의 다리 문제(한붓그리기)'가 그래프 이론의 시초로 알려져 있음

- 그래프의 예 : 지도에서 도시들의 연결, 지하철 노선도, SNS 친구 관계도 등

 

∙ 그래프의 구성 요소

- 그래프 G = (V, E)

- 정점 (vertex, node) : V

> 그래프를 구성하는 기본 단위. 노드

> 자료를 저장하거나 상태를 표현

- 에지 (edge, link) : E

> 정점과 정점을 잇는 선, 간선

> 방향을 가질 수 있음

> 가중치를 가질 수 있음

 

 

∙ 인접 행렬(adjacency matrix)

- 정점 개수가 N인 경우, N X N 크기의 2차원 행렬로 정점의 인접 관계를 표현하는 방법

- adj [u][v] : 노드 u에서 노드 v로 가는 간선이 있으면 1, 아니면 0

- 그래프 정점 개수가 적고, 에지가 많을 때 유리 공간 복잡도는 O(N^2)

 

∙ 인접 리스트 (adjacency list)

- 각 정점에 인접한 정점들을 연결리스트로 표현

- 보통 정점 개수에 해당하는 배열의 각 원소에 연결 리스트가 속해 있는 형태로 표현

- 공간 복잡도는 O(N + M) (N : 정점 개수, M : 에지 개수)

 

 

∙ 에지 리스트 (edge list)

- 모든 에지 (u, v)를 리스트 또는 배열로 표현

- 공간 복잡도는 O(M) (M : 에지 개수)

 

∙ 인접 행렬을 인접 리스트로 변환하는 예제 프로그램

#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> get_adj_list(const vector<vector<int>>& adj_matrix)
{
    // 인접 리스트를 저장할 벡터 생성
    vector<vector<int>> adj_list(adj_matrix.size());
    
    // 행번호에 해당하는 정점과 인접해 있는 정점번호를 푸시
    for (int u = 0; u < adj_matrix.size(); u++){
        for (int v = 0; v < adj_matrix.size(); v++){
            if (adj_matrix[u][v] == 1)
                adj_list[u].push_back(v);
        }
    }
    return adj_list;
}
/*
// 인접 리스트 (adjacency list)
 vector<vector<int>> adj_list = {
    {1, 3, 4},
    {0, 2, 4},
    {1, 5},
    {0, 4},
    {0, 1, 3},
    {2}
 };
 
*/

int main()
{
    // 인접 행렬 (adjacency matrix)
    vector<vector<int>> adj_matrix = {
        {0, 1, 0, 1, 1, 0},
        {1, 0, 1, 0, 1, 0},
        {0, 1, 0, 0, 0, 1},
        {1, 0, 0, 0, 1, 0},
        {1, 1, 0, 1, 0, 0},
        {0, 0, 1, 0, 0, 0}
        
    };
    
    vector<vector<int>> adj_list = get_adj_list(adj_matrix);
    
    for (const auto& l : adj_list){
        for (const auto n : l)
            cout << n << ", ";
        cout << endl;
    }
}

'코딩 및 기타 > 어서와! 자료구조와 알고리즘' 카테고리의 다른 글

그래프 순회 응용 (네트워크)  (0) 2023.09.01
DFS 와 BFS  (0) 2023.08.31
순서없는 연관 컨테이너  (0) 2023.08.30
해싱과 해시 함수  (0) 2023.08.30
우선순위 큐  (0) 2023.08.28