자세한 내용은 https://blog.encrypted.gg/1016 를 참고하면 좋습니다.
그외 참고 사이트
https://velog.io/@orcasuit/그래프vertex-edge-node-arc
https://velog.io/@ffwang/인접-행렬과-인접-리스트
https://suyeon96.tistory.com/32

위와 같은 것을 우리는 알고리즘에서 그래프라고 합니다. 그림에서도 알 수 있듯이 그래프는 Vertex라는 노드와 Edge라고 불리는 간선의 집합으로 구성됩니다.
그래프를 구현하는 방법에는 배열(Array)을 사용하는 인접 행렬 방법과 연결리스트(Linked List)를 사용하는 인접 리스트 방법이 있다.
그래프의 정점과 연결되는 간선을 2차원 배열로 만든 것.

정점의 개수에 따라 V*V의 2차원 배열을 인접 행렬로 사용.
인접 행렬에서 행과 열은 정점을 의미하고, 각각의 원소들은(1, 0) 정점 간 간선 나타낸다.
가중치 그래프라면 원소들에 해당되는 가중치를 입력한다.
무방향 그래프는 0,0을 기준으로 대칭적인 구조를 가집니다.(대각선)왜냐하면, 서로 연결된것이랑 다름없기 때문이다.
그래서 인접 행렬을 쓸때, 무방향 그래프일때 0,0 기준으로 나눠서 공간을 절약할 수 있다.
그래프의 각 정점에 인접한 정점들을 연결리스트로 표현한 것.

해당 방식은 인접 행렬과 비교했을때, 정점이 많고 간선은 적은, 작은 상황에서 공간을 절약할 수 있는 방식.
경우에 따라 인접 행렬로는 절대 저장이 불가능해서 인접 리스트만 써야하는 경우도 있다.
정점의 개수만큼 인접리스트가 존재한다. 각각의 인접리스트에는 인접한 정점 정보가 저장되는 것이다. (A에는 A와 연결된 노드를 다 연결) 그래프는 각 인접리스트에 대한 헤드포인터를 배열로 갖는다.
무방향 그래프의 경우 간선이 추가되면 각각의 정점의 인접리스트에 반대편 정점의 노드도 추가해야 한다.(당연)
그러면 인접 행렬과 리스트의 장단점, 특징, 차이점을 알아보자
V: 정점, E: 간선

파이썬에서는 networkx라는 라이브러리나 리스트와 딕셔너리를 적절히 사용하여 그래프를 쉽게 표현 가능.
#파이썬에서 인접 리스트를 이용한 예시(딕셔너리)
#무방향 그래프
graph1 = {1: [2, 3, 5], 2: [1, 3], 3: [1, 2, 4], 4: [3, 5], 5: [1, 4]}
#방향 그래프
graph2 = {1: [2, 3], 2: [3], 3: [4], 4: [], 5: [1, 4]}
#아래와 같이 딕셔너리 대신 리스트를 이용하여 그래프를 표현가능하다.
#무방향 그래프
graph1 = [[], [2, 3, 5], [1, 3], [1, 2, 4], [3, 5], [1, 4]]
#방향 그래프
graph2 = [[], [2, 3], [3], [4], [], [1, 4]]
#만약 위의 인접 리스트를 인접 행렬로 표현하면 아래와 같이 된다.
# 무방향 그래프 (인접 행렬)
graph1_matrix = [
[0, 1, 1, 0, 1], # 1번 노드
[1, 0, 1, 0, 0], # 2번 노드
[1, 1, 0, 1, 0], # 3번 노드
[0, 0, 1, 0, 1], # 4번 노드
[1, 0, 0, 1, 0] # 5번 노드
]
# 방향 그래프 (인접 행렬)
graph2_matrix = [
[0, 1, 1, 0, 0], # 1번 노드 → 2, 3
[0, 0, 1, 0, 0], # 2번 노드 → 3
[0, 0, 0, 1, 0], # 3번 노드 → 4
[0, 0, 0, 0, 0], # 4번 노드 → 없음
[1, 0, 0, 1, 0] # 5번 노드 → 1, 4
]
# 딕셔너리, set은 서칭이 빠르다.
이러한 그래프는 네트워크 디자인, 경로 찾기, 소셜 네트워크(팔로우), 탐색 알고리즘(검색), 작업 스케줄링에서 잘 쓰입니다.