정의
- vertex(node)와 edge(간선)으로 이루어진 것
- 표현
- V(g) = {a, b, c, d, e}
- E(g) = {(a,b), (a,c), (a,d), (b,e), (d,e)}
용어
- adjacent: 두 vertex간의 edge 존재
- path: 두 vertex간에 edge로 연결된 vertex의 sequence
- length of a path: path를 구성하는 edge 개수
- connected: 두 vertex간에 path가 존재
- connected component: 연결된 요소
- cycle: 시작과 끝이 동일 vertex인 path
- degree of vertex: 그 vertex와 연결된 edge 수(그래프의 방향성 여부에 따라 용어 의미가 조금씩 달라짐)
- indegree: incoming edge(directed graph만 존재)
- outdegree: outgoing edge
- fully connected graph의 edge 수
- n(n-1)/2
edge
- (V1, v2): 방향성이 없는 edge --> graph(undirected graph)
- <v1, v2>: 방향성을 갖는 edge --> directed graph(digraph)
- strongly connected: directed graph에서 양방향 path 존재(edge가 아니라 path임)
- 한 그래프에 두개의 edge가 있는 경우는 없음
한붓 그리기
- 선을 떼지 않고 한번에 그릴 수 있는 도형
- 한붓 그리기 가능한 graph 형태
- degree가 홀수인 vertex가 없거나 2개인 경우
- degree가 홀수이면 시작점이나 마지막 지점이 되어야 하기때문에
그래프 표현
- matrix
- undirected graph: 대칭(가운데 대각선 기준)
- 링크드 리스트
- matrix와 달리 실제 vertex들에 대한 정보만 저장
그래프 탐색(search)
- dfs(깊이 우선 탐색)
- 백트래킹을 위해 스택 필요 --> 스택 empty일 때 종료
- bfs(너비 우선 탐색)
- 큐 사용
spanning tree
- graph g의 spanning tree
- g의 모든 vertex를 연결하는 cycle이 없는 subgraph
- 그래프의 최소 연결 그래프, 모든 vertex를 연결하면서 cycle이 존재 하지 않는 최소 연결 그래프
biconnected components
- articulation point를 갖지 않는 connected graph --> 양쪽으로 튼튼하게 연결이 되어 있음을 의미
- articulaion point(단절점)
- 해당 vertex를 삭제 했을 때, 원 그래프가 두 개 이상의 biconnected component로 분리되는 vertex
minimum cost spanning tree
- weighted graph에서 cost의 합이 최소인 spanning tree를 찾는 문제 --> 여러개의 spanning tree 중에서 cost의 합이 최소인 spanning tree를 찾는 문제
- krukal's algorithm
- 전체 edge의 집합을, cost 순서로 sorting
- cost 순서로, 해당 edge가 cycle을 이루지 않으면 선택
- (n-1)개의 edge가 선택될 때까지 반복
- prim's algorithm --> krukal 같은 경우는 어디서 edge가 생성될 지 모르기 때문에 더 복잡하다고 생각
- connected component와 외부로 연결된 edge중에서 최소 cost edge 선택
- (n-1)개의 edge가 선택될 때까지 반복
- solin's algorithm
- 각 vertex를 서로 다른 connected component로 고려
- 각 connected component에 대하여 최소 cost edge를 한 개씩 추가 --> spanning tree를 찾는 문제이므로 cycle이 되는 경우는 고려하지 않음, cycle을 이루지 않는 경우 선택
- 전체가 한 개의 connected component가 되면 종료
shortest path algorithm
- 특정 vertex에서 다른 모든 vertex에 이르는 최단 거리 path를 구하는 문제
- 기준 vertex에 해당하는 row를 초기값으로 설정
- 다음을 (n-2)회 반복 --> 맨 처음 노드는 처음 vertex 선택하는 것으로 대체, 가장 마지막 노드는 나머지가 다 처리되어 할 작업이 없음
- 아직 방문하지 않은 vertex 중에서 가장 가까운 vertex 선택
- 해당 vertex를 거쳐서 가는 path가 현재 알려진 path보다 짧으면 수정
matrix 표현
- adjacancy matrix: A
- vertex간 edge가 존재하면 1, 아니면 0
- transitive closure(이행적 폐쇄 행렬): A+
- vertex간에 path가 존재하면 1, 아니면 0
- 가운데 대각선 1 --> cycle 존재
- reflexive transitive closure: A*
- 자신과의 path도 고려한 transitive closure
activity network
- aov(activity on vertex) networks
- directed graph
- vertex: 어떤 task나 activity를 의미
- edge: activity의 선후관계를 의미
- 예시: topological sort --> 모든 vertex가 선택되지 않은 경우: cycle이 존재하는 경우
- aoe(activity on edge) networks
- edge가 activity를 의미하며, vertex는 시작과 종료 event 의미
- critical path(유사: bottle neck)
- 전체 성능에 영향을 주는 activities
- start vertex부터 finish vertex까지의 longest path
- earliest start time --> 빠르면 언제부터 시작할 수 있는지
- 해당 activity가 시작될 수 있는 가장 빠른 시간
- latest start time --> 늦어도 언제는 시작해야 함
- 해당 activity가 시작되어야 하는 가장 늦은 시간