노드와 간선으로 이루어져 있는 자료구조.
그래프 G=(V,E) 는
유한한 공집합이 아닌 Vertex의 집합 V와
서로 다른 Vertices의 쌍인 Edge의 집합 E로 이루어진다.
adjacent : 두 Vertex가 Edge로 연결되어 있으면 adjacent하다.
incident : Edge (0,1)은 두 노드 0, 1과 incident라고 하고, 0,1을 Edge (0, 1)의 endpoints 라고 한다.
path : 노드 u에서 v까지 연결되어 있는 Edge의 집합. 길이는 원소의 수이다.
cycle : 한 노드에서 출발해 같은 노드로 도착하는 path.
non-cycle=simple : 길이가 3 이상이고 cycle이 없는 그래프를 simple이라고 한다.
acyclic : simple cycle을 포함하지 않는 그래프
간선에 가중치가 주어진 그래프.
모든 쌍의 vertices 사이에 path가 존재한다면 connected라고 한다.
connect 그래프가 아니라면 두개 이상의 부분 그래프의 합집합이 되는데, 이 경우 각 연결된 부분 그래프를 Connected Component라고 한다.
Tree도 일종의 그래프라고 볼 수 있다.
차이점을 꼽자면
무방향 그래프 G에 대해, G의 모든 vertex를 포함하는 부분 그래프.
방향 그래프에서 방향을 제거한 무방향 그래프.
원래 digraph가 방향에도 불구하고 모든 노드 간 path가 존재한다면 strongly connected라고 하고, underlying graph만 connected라면 weakly connected라고 한다.
한 vertex의 쌍에 대해 여러 간선이 존재할 수 있다.
loop이 허용되는 Multigraph이다.
대부분 그래프는 인접행렬이라는 것으로 구현한다.
인접행렬이란 위 그림처럼 <i, j> 간 간선이 존재한다면 [i][j]와 [j][i]에 모두 true 혹은 정수를 넣어주는 방법이다. 이를 통해 vertex 간 연결을 확인할 수 있다.
Directed Graph의 경우에는 <i, j>인 경우에만 [i][j]에 표시한다.
Weighted Graph의 경우 가중치만큼 표시하거나, 따로 행렬을 만들어서 가중치를 함께 보관하는 방법이 있다.
인접 리스트도 같은 개념이지만, Linked List의 배열을 통해서 구현한다. i번째 요소는 i번째 vertex와 연결되어 있는 vertex를 연결 리스트의 형태로 담고 있다.
방향 그래프라면 adjacent to, from 식으로 다른 응용을 통해 저장할 수 있다.
[ v1, v2, link for v1, link for v2 ] 식으로 노드가 구성되어 있어 훨씬 적은 수의 포인터로 구현이 가능하다.