| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 공부
- std::map
- 스택
- 트리
- map
- 힙영역
- 인프런
- vector
- 배열
- 멀티쓰레드
- 반복문
- 기술면접
- MonoBehaviour
- 차이점
- 프래그멘테이션
- rookiss
- thread
- static_cast
- 해쉬맵
- c#
- list
- 자료구조
- 스택영역
- Queue
- 리스트
- 객체지향
- 큐
- 벡터
- 알고리즘
- std::unordered_map
- Today
- Total
호빵의 IT 개발소
[C#] 그래프 이론 본문
1. 그래프의 개념
-[현실 세계의 사물이나 추상적인 개념 간]의 [연결 관계]를 표현
정점(Vertex) : 데이터를 표현(사물, 개념 등)
간선(Edge) : 정점들을 연결하는데 사용

ex) 소셜 네트워크 관계도 (페이스북)
-이 그래프에서 0번이 본인이라고 가정할 때 1번과 2번은 친구 관계, 3번과 4번은 직접은 모르지만 친구의 친구 관계라고 할 수 있습니다.

ex) 지하철 노선도
-간선에다가 수치를 추가할 수 있다. 지하철로 예를 들어보면 0번역에서 2번역까지 15분이 걸리고. 2번역에서 3번역은 5분이 걸린다.

ex) 일방 통행이 포함된 도로망
ex) 두 사람 사이의 호감도
-간선에 방향이 생겨서 0번에서 1번으로 가는 간선은 있지만 1번에서 0번으로 가는 간선은 없다. 호감도로 예를 들면 0번과 2번은 서로 호감이 있고, 4번과 5번은 5번만 호감을 가지고 있다.
방향 가중치 그래프 - 리스트 배열
List<int>[] adjacent = new List<int>[6]
{
new List<int> { 1, 2 }, //0번 -> 1번, 2번
new List<int> { 2 }, //1번 -> 2번
new List<int> { 0, 3, 4 }, //2번 -> 0번, 3번, 4번
new List<int> { },
new List<int> { },
new List<int> { 4 }, //5번 -> 4번
}
- 읽는 방법 : adjacent[from] -> 연결된 목록
- 리스트를 이용한 그래프 표현
- 메모리는 아낄 수 있지만, 접근 속도에서 손해를 본다.
- 간선이 적고 정점이 많은 경우 이점이 있다.
방향 그래프 - 행렬 (2차원 배열) 이용하기
- 읽는 방법 : adjacent[from, to]
- 접근 속도를 높이기 위해, 행렬을 사용 할 수도 있다.
int[,] adjacent2 = new int[6, 6]
{
{ 0, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0 },
{ 1, 0, 0, 1, 1, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0 },
}
만약 방향그래프에서 가중치가 더해지면 리스트를 어떻게 작성해야 할까요?

방향 가중치 그래프 - 리스트 배열
class Edge
{
public Edge(int v, int w) { vertex = v; weight =w; }
public int vertex;
public int weight;
}
List<Edge>[] adjacent = new List<Edge>[6]
{
new List<Edge>() { new Edge(1, 10), new Edge(2, 15) },
new List<Edge>() { new Edge(2, 15) },
new List<Edge>() { new Edge(0, 15), new Edge(3, 5), new Edge(4, 5) },
new List<Edge>() { },
new List<Edge>() { },
new List<Edge>() { new Edge(4, 5) },
}
방향 가중치 그래프 - 행렬(2차원 배열)
- 안 쓰는 숫자(예 : -1)를 사용해서 연결이 끊긴 것을 표현
int[,] adjacent2 = new int[6, 6]
{
{ -1, 10, 15, -1, -1, -1 },
{ -1, -1, 15, -1, -1, -1 },
{ 15, -1, -1, 5, 5, -1 },
{ -1, -1, -1, -1, -1, -1 },
{ -1, -1, -1, -1, -1, -1 },
{ -1, -1, -1, -1, 5, -1 },
}
---------------------------------------------------------------------------------------------------------------------------
참고 : [인프런] Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
'자료구조와 알고리즘 > 자료구조와 알고리즘 맛보기' 카테고리의 다른 글
| [C#] BFS (너비 우선 탐색) (0) | 2022.01.13 |
|---|---|
| [C#] DFS(깊이 우선 탐색) (0) | 2022.01.13 |
| [C#] 스택과 큐 (0) | 2022.01.11 |
| [C#] 연결 리스트 (0) | 2022.01.11 |
| [C#] 동적 배열 구현 (0) | 2022.01.11 |