그래프(Graph)

- 사물을 정점과 간선으로 나타내기 위한 도구

- 그래프는 두 가지 방식으로 구현할 수 있음

 

1. 인접 행렬(Adjacency Matrix) : 2차원 배열을 사용하는 방식

 - 인접 행렬에서는 그래프를 2차원 배열로 표현

- 모든 정점들의 연결 여부를 저장하여 O(V2)의 공간을 요구하므로 공간 효율성이 떨어지지만 두 정점이 서로 연결되어 있는지 확인하기 위해 O(1)의 시간을 요구

 

2. 인접 리스트(Adjacency List) : 리스트를 사용하는 방식

- 연결된 간선의 정보만을 저장하여 O(E)의 공간을 요구하므로 공간 효율성이 우수하지만 두 정점이 서로 연결되어 있는지 확인하기 위해 O(V)의 시간을 요구

 

무방향 비가중치 그래프와 인접 행렬

- 모든 간선이 방향성을 가지지 않는 그래프를 무방향 그래프라고 함

- 모든 간선에 가중치가 없는 그래프를 비가중치 그래프라고 함

- 무방향 비가중치 그래프가 주어졌을 때 연결되어 있는 상황을 인접 행렬로 출력할 수 있음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int a[1001][1001];
int n, m;

int main(void) {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        a[x][y] = 1;
        a[y][x] = 1;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    system("pause");
}

 

방향 가중치 그래프와 인접 리스트

- 모든 간선이 방향을 가지는 그래프를 방향 그래프라고 함

- 모든 간선에 가중치가 있는 그래프를 가중치 그래프라고 함

- 방향 가중치 그래프가 주어졌을 때 연결되어 있는 상황을 인접 리스트로 출력할 수 있음

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int index;
    int distance;
    struct Node *next;
} Node;

void addFront(Node *root, int index, int distance) {
    Node *node = (Node*) malloc(sizeof(Node));
    node->index = index;
    node->distance = distance;
    node->next = root->next;
    root->next = node;
}

void showAll(Node *root) {
    Node *cur = root->next;
    while (cur != NULL) {
        printf("%d(거리: %d) ", cur->index, cur->distance);
        cur = cur->next;
    }
}

int main(void) {
    int n, m;
    scanf("%d %d", &n, &m);
    Node** a = (Node**)malloc(sizeof(Node*) * (n + 1));
    for (int i = 1; i <= n; i++) {
        a[i] = (Node*)malloc(sizeof(Node));
        a[i]->next = NULL;
    }
    for (int i = 0; i < m; i++) {
        int x, y, distance = 0;
        scanf("%d %d %d", &x, &y, &distance);
        addFront(a[x], y, distance);
    }
    for (int i = 1; i <= n; i++) {
        printf("원소 [%d]: ", i);
        showAll(a[i]);
        printf("\n");
    }
    system("pause");
    return 0;
}

'자료구조 알고리즘' 카테고리의 다른 글

너비 우선 탐색  (0) 2020.12.18
깊이 우선 탐색  (0) 2020.12.17
순차 탐색과 이진 탐색  (0) 2020.12.17
우선순위 큐  (0) 2020.12.17
이진 트리의 구현 및 순회  (0) 2020.12.17
Posted by khon98
,