- 방향성
- 가중치
- 사이클 ➡️ 없는 그래프는 트리
- 연결성 ➡️ 있으면 연결 그래프, 없으면 비연결 그래프

무방향 그래프
방향 그래프
가중치 그래프
연결 그래프
비연결 그래프
순환 그래프
비순환 그래프

그래프가 이루어진 정점과 간선의 숫자 집합
인접행렬 구하기
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | |||
| 2 | 1 | 1 | 1 | ||
| 3 | 1 | 1 | |||
| 4 | 1 | 1 | |||
| 5 | 1 |

그래프가 이루어진 정점과 간선의 숫자 집합
인접행렬 구하기
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | |||
| 2 | 1 | ||||
| 3 | 1 | ||||
| 4 | 1 | ||||
| 5 |

| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 1 | 2 | 4 | |||
| 2 | 5 | ||||
| 3 | 5 | ||||
| 4 | 2 | ||||
| 5 |


💡 연결 요소(Connected Component)
- 그래프에서 어떤 정점으로부터 다른 정점으로 갈 수 있는 경로들의 집합
- 연결 요소들은 그래프의 최대로 연결된 부분 그래프가 됨

for (int i = 0; i < 간선의 수; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
// 인접행렬 방법
graph[x][y] = 1;
graph[y][x] = 1;
}
총 노드 수: graph.length - 1
그래프의 연결 상태를 연결 리스트로 나타내는 자료구조
💡 연결 리스트
- 데이터 요소가 노드로 구성된 선형 자료구조
- 각 노드는 데이터와 다음 노드를 가리키는 링크(포인터)로 이루어져 있음
1차원 배열의 형식
배열의 크기 = 노드의 개수
행렬과 다르게 ArrayList의 자료구조를 이용해서 만드는 방식
동적할당이기 때문에 크기를 미리 정해주지 않아도 됨

int[][] graph = {
{},
{2,3,7},
{1,3,5},
{1,2},
{6,8},
{2},
{4,7,8},
{1,6},
{4,6}
};
위의 배열을 인접 리스트를 통해 그래프로 그릴 때,
각 배열의 인덱스는 그래프의 노드를 나타냄
해당 인덱스의 요소들은 해당 노드와 연결된 다른 노드들의 리스트를 표현노드 1: {2, 3, 7}
노드 2: {1, 3, 5}
노드 3: {1, 2}
노드 4: {6, 8}
노드 5: {2}
노드 6: {4, 7, 8}
노드 7: {1, 6}
노드 8: {4, 6}
총 노드 수: graph.length - 1 (인덱스가 1부터 시작하기 때문)
N = Integer.parseInt(br.readLine());
ArrayList<Integer>[] map = new ArrayList[N + 1];
for(int i = 1; i <= N; i++) {
map[i] = new ArrayList<>();
}
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
map[x].add(y);
map[y].add(x);
}