반응형
이 문제는 이분 그래프인지 아닌지를 확인하는 문제입니다.
우선 이분 그래프가 무엇인지에 대해서 설명드리겠습니다.
이분 그래프란 위의 그림과 같이 연결된 두 정점의 색깔을 다르게 칠할 수 있는 그래프입니다.
위의 그림과 같이 빨간 간선이 추가되어 연결된 두 노드의 색깔이 같다면 이는 이분 그래프라 말할 수 없습니다.
그래프가 이분 그래프인지 확인하는 방법은 dfs를 이용하는 방법과 bfs를 이용하는 방법이 있습니다.
저는 이 중에서 dfs를 이용하였습니다.
하나의 정점을 선택한 후 dfs를 이용하여 이동할 때 이동한 간선이 이전의 간선과 다른 타입으로 만들 수 있는지를
확인하면서 진행하였습니다.
이미 방문한 정점이라도 다른 타입인지를 확인하게 만들었습니다.
코드를 보여드리도록 하겠습니다.
import java.io.*;
import java.util.*;
public class Main {
static List<List<Integer>> l;
static boolean[] visited;
static int[] type;
static boolean flag;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuffer sb = new StringBuffer();
int K = Integer.parseInt(br.readLine());
while (K-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
visited = new boolean[V+1];
type = new int[V+1];
l = new ArrayList<>();
for(int i = 0; i<=V; i++)
l.add(new ArrayList<>());
//그래프의 간선을 입력
for(int i = 0; i<E; i++){
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
l.get(A).add(B);
l.get(B).add(A);
}
flag = true;
//연결 그래프가 아닐 수 있으므로 모든 정점에 대해서 dfs
for(int i = 1; i<=V; i++)
if(!visited[i])
dfs(i, 2);
if(flag)
sb.append("YES").append("\n");
else
sb.append("NO").append("\n");
}
System.out.print(sb);
}
static void dfs(int vertex, int exType){
visited[vertex] = true;
type[vertex] = exType == 1 ? 2 : 1;
for(int i = 0; i<l.get(vertex).size(); i++){
int nextVertex = l.get(vertex).get(i);
if(visited[nextVertex]) {
if (type[vertex] == type[nextVertex])
flag = false;
}
else
dfs(nextVertex, type[vertex]);
}
}
}
위와 같이 dfs를 사용할 수도 있고 bfs를 이용하여 주변의 노드들을 다른 색으로 칠할 수 있는지 확인하면서 문제를 해결할 수도 있습니다.
반응형
'알고리즘 > 깊이 우선 탐색(dfs)' 카테고리의 다른 글
백준 2644번 : 촌수계산 java (0) | 2022.07.07 |
---|---|
백준 1987번 : 알파벳 java (0) | 2022.06.17 |
백준 4963번 : 섬의 개수 java (0) | 2022.06.09 |
백준 1967번 : 트리의 지름 java (0) | 2022.06.08 |
백준 17070번 : 파이프 옮기기 1 java (0) | 2022.06.06 |
댓글