- 노드(정점) : 정점, 무엇이든 표시할 수 있다.
- 에지(간선) : 노드 간 연결선
그래프를 구현하는 3가지 방법이 있다

방향이 없는 그래프라면 [1,2]와 [2,1]은 같은 표현일 것이다.

인접 행렬은 2차원 배열을 자료구조로 이용하여 그래프를 표현한다. 인접 행렬은 에지리시트와 다르게 노드 중심으로 그래프를 표현한다.
구현하기 쉬움
두 노드를 연결하는 에지의 여부와 가중치값을 배열에 직접 접근하면 바로 확인할 수 있음
노드와 관련되어있는 에지를 탐색하려면 N번 접근해야하므로 노드 개수에 비해 에지가 적을 때는 공간 효율이 떨어짐
노드 개수가 많은 경우 아예 2차원 배열 선언 자체를 할 수 없는 결함도 있다.
-> 인접 행렬은 노드 개수에 따라 사용 여부를 적절히 판단해야한다.
ex) 노드가 3만개 넘으면 자바 힙 스페이스 에러가 발생!



노드1과 연결된 노드 2,3은 ArrayList[1]에 [2,3]을 연결한다.

그림을 보면, ArrayList[1]에 [(2,8),(3,3)]이 연결되어있다.
-> 노드1과 2가 가중치 8에지로, 노드 1과 3이 가중치 3에지로 연결되어있다는 뜻
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class P1707_이분그래프 {
static ArrayList<Integer>[] al;
static boolean[] visited;
static int[] check;
static boolean isEven;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int K = Integer.parseInt(st.nextToken());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
al = new ArrayList[V + 1];
visited = new boolean[V + 1];
check = new int[V + 1];
isEven = true;
for (int j = 1; j <= V; j++) al[j] = new ArrayList<Integer>();
for (int j = 0; j < E; j++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
al[s].add(e);
al[e].add(s);
}
for (int j = 1; j <= V; j++) {
if (isEven) DFS(j);
else break;
}
if (isEven) System.out.println("YES");
else System.out.println("NO");
}
}
public static void DFS(int node) {
visited[node] = true;
for (int i : al[node]) {
if (!visited[i]) {
check[i] = (check[node] + 1) % 2;
DFS(i);
} else {
if (check[node] == check[i]) {
isEven = false;
}
}
}
}
}
