그래프(Graph)의 정의와 표현
그래프(Graph)란?
위의 그림은 일상 생활에서 돈관계를 그래프 구조로 표현을 한 것이다.
민희는 철수에게 5000원을 갚아야 하고,
철수는 영희에게 6000원,
영희는 민수에게 100원,
민수는 영희에게 500원 을 갚아야 하는 관계이다.
이렇게 실제 세계의 현상, 즉 여기에서는 사물들 간의 관계를 그래프로 표현 할 수 있다.
두 번째 예는 집에서 학교 도서관, 또는 강의실로 가는 경로를 그래프로 표현을 해본 것이다.
용어
간단한 종류
유향 그래프(Directed Graph) - 정점 간의 간선이 방향이 존재할 경우
그래프를 어디에?
그래프의 구현
그래프의 구현은 크게 두가지로 나뉘어 진다.
1. 인접행렬(Adjacency Matrix)
2. 인접리스트(Adjacency List)
아래 그림으로 보면서 살펴보자.
우리가 표현하고 싶은 무방향, 가중치가 있는 그래프이다.
[인접 행렬로 표현]
1. 행과 열에 각각 정점의 번호를 순서대로 쓴다.
2. i행 j열에 i행에서 j열로 가는 간선(E)의 가중치를 쓴다.(가중치가 없다면 주로 1로 둔다.)
[인접 리스트로 표현]
1. 각 정점의 중심점들을 순서대로 쓴다.
2. 각 정점에서 연결되는 정점이 있다면, 그 정점과 가중치를 가르키는 구조를 만들고 적어준다.
2가지 표현법에 대해서 장단점이 존재를 하는데 알아두는 것이 좋다.
인접 행렬의 경우 인접 리스트에 비해서,
접근이 빠른 대신, 메모리의 낭비가 심하다.
인접 리스트의 경우 인접 행렬에 비해서,
접근이 느린 대신, 메모리의 낭비가 적다.
즉, 사용하는 목적에 맞춰서 어떤 구조를 이용해 그래프를 사용해야 하는지 적절하게 고르는 것이 중요하다.
개인적으로는 그래프의 간선이 많은경우 인접행렬을 이용하고, 간선이 적은 경우 인접리스트를 사용한다.
C++ 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <iostream> #include <vector> #include <tuple> #define VSIZE 500 using namespace std; int main() { int VertexN; //정점의 갯수 int EdgeN; //간선의 갯수 cin >> VertexN >> EdgeN; vector<tuple<int, int, int>> Edge(EdgeN); //간선의 정보를 저장 for (int i = 0; i < EdgeN; i++) { int A, B, W; //A에서 B로 W의 가중치를 가진다. scanf("%d %d",&A,&B,&W); Edge.push_back(make_tuple(A, B, W)); } //인접행렬 int graphMatrix[VSIZE + 1][VSIZE + 1]; //최대 갯수만큼미리 선언 for (auto i : Edge) { int V1 = get<0>(i); //A int V2 = get<1>(i); //B int W = get<2>(i); //Weight //양방향 기록 graphMatrix[V1][V2] = W; graphMatrix[V2][V1] = W; } //인접리스트 vector<pair<int, int>> graphList[VSIZE + 1]; for (auto i : Edge) { int V1 = get<0>(i); //A int V2 = get<1>(i); //B int W = get<2>(i); //Weight //양방향 기록 graphList[V1].push_back(make_pair(V2, W)); graphList[V2].push_back(make_pair(V1, W)); } } | cs |
<위의 예제와 똑같은 Input>
3 3
1 2 10
1 3 20
2 3 30
위의 Input을 넣으면 예제와 똑같은 모양의 그래프를 만들 수 있다.
'알고리즘 > 이론' 카테고리의 다른 글
max-heap, min-heap - 이진트리의 활용 (2) | 2016.09.14 |
---|---|
이진트리(Binary Tree) - 트리(Tree)의 기초 (1) | 2016.09.13 |
이진탐색(Binary Search)와 Parametric Search (2) | 2016.09.13 |
퀵소트(quick sort) 알고리즘 (4) | 2016.09.08 |
네트워크플로우(Network flow) - 포드 풀커슨(Ford-Fulkerson) 알고리즘 (3) | 2016.07.28 |