import java.util.*;
import java.io.*;
public class Main
{
static int v, e; // 정점, 간선
static ArrayList<Integer>[] al; // 연결 정보 저장
static int visit[]; // 초기화 0, 이후 1 or 2
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stz = new StringTokenizer(br.readLine());
int t = Integer.parseInt(stz.nextToken());
for(int i=0; i<t; i++){
stz = new StringTokenizer(br.readLine());
v = Integer.parseInt(stz.nextToken());
e = Integer.parseInt(stz.nextToken());
visit = new int[v + 1];
al = new ArrayList[v + 1];
// 간선 개수 만큼 al 만들기
for(int j=0; j <= v; j++){
al[j] = new ArrayList<>();
}
// al에 정보 입력하기
for(int k=0; k < e; k++){
stz = new StringTokenizer(br.readLine());
int p1 = Integer.parseInt(stz.nextToken());
int p2 = Integer.parseInt(stz.nextToken());
al[p1].add(p2);
al[p2].add(p1);
}
bfs();
}
}
private static void bfs() {
Queue<Integer> q = new LinkedList<>();
for(int i = 1; i <= v; i++){
if(visit[i] == 0){
visit[i] = 1;
q.add(i);
}
while(!q.isEmpty()){
int now = q.poll();
// now 의 al 정보 탐색
for(int j=0; j < al[now].size(); j++){
// 만약 0이다 => 반대편 색깔로 만들어 주기
if(visit[al[now].get(j)] == 0){
q.add(al[now].get(j));
if(visit[now] == 1){
visit[al[now].get(j)] = 2;
} else if (visit[now] == 2){
visit[al[now].get(j)] = 1;
}
}
else if(visit[al[now].get(j)] == visit[now]){
System.out.println("NO");
return;
}
}
}
}
System.out.println("YES");
}
}
생각 정리
bfs로 어떻게
일단 현재 점 기준으로
다음 정점 방문 할 때 인접한 정점이면 다른 색
=> 인접한 정점인지 어떻게 판별하지
colors = new int []
red = 1
blue = 2
queue 를 활용한 bfs
arraylist에 연결된 정점 입력 ex) 1 3 => al[1] = 3, al[3] = 1
queue에 무엇을 집어 넣음?
1인지 2인지 확인하도록
일단 초기화 1 집어넣음
'알고리즘' 카테고리의 다른 글
<백준> 1920번 자바 알고리즘 [이분 탐색] (0) | 2022.02.08 |
---|---|
<백준> 1260번 자바 알고리즘 [BFS, DFS] (0) | 2022.01.29 |
<백준> 7562번 자바 알고리즘[BFS] (0) | 2022.01.24 |
<백준> 2206번 자바 알고리즘[BFS] (0) | 2022.01.21 |
<백준> 1697번 자바 알고리즘[BFS] (0) | 2022.01.19 |