녕의 학습 기록
백준_1707 이분 그래프 (DFS) 본문
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BJ_1707_이분그래프 {
static ArrayList<Integer>[] arr;
static boolean[] visited;
static int[] check;
static boolean dfsResult;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine());
int i, j, v, e, a, b;
StringTokenizer st;
StringBuilder sb = new StringBuilder();
for (i=0; i<k; i++) {
st = new StringTokenizer(br.readLine(), " ");
v = Integer.parseInt(st.nextToken());
e = Integer.parseInt(st.nextToken());
arr = new ArrayList[v+1];
visited = new boolean[v+1];
check = new int[v+1];
for (j=1; j<v+1; j++) {
arr[j] = new ArrayList<>();
}
for (j=0; j<e; j++) {
st = new StringTokenizer(br.readLine(), " ");
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
arr[a].add(b);
arr[b].add(a);
}
dfsResult = true;
for (j=1; j<v+1; j++) { //연결 그래프가 아닐 수 있으므로 모든 연결요소 고려
if (visited[j] == false) {
dfs(j, 1);
}
if(dfsResult==false) { //이미 정답이 아닐 경우 더이상 진행 x
break;
}
}
if (dfsResult == true) {
sb.append("YES\n");
} else {
sb.append("NO\n");
}
}
System.out.println(sb);
}
static void dfs(int n, int x) { //x는 n의 집합과 다른 인접노드의 집합 번호
visited[n] = true;
for (int nextNode : arr[n]) {
if (dfsResult==false) { //이미 이분 그래프가 아닌게 밝혀진 경우
break;
}
if (visited[nextNode] == false) {
check[nextNode] = x; //방문 안한 노드는 현재 노드와 다른 x집합
dfs(nextNode, check[n]); //인접 노드의 인접 노드는 현재 노드와 같은 집합
} else { //이미 방문한 인접 노드일 경우
if (check[nextNode] == check[n]) { //현재 노드와 집합이 같으면 이분그래프x
dfsResult = false;
break;
}
}
}
}
}
처음으로 다른 풀이를 참조하지 않고 골드 문제를 풀어냄 (반례 테스트코드 1개는 찾아봄 ㅎ)
여전히 몹쓸 알고리즘 실력이지만, 한달 전과 비교하면 나름 성장한 거 같아 뿌듯
1707번: 이분 그래프
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에
www.acmicpc.net
'Algorithm > Algorithm 문제' 카테고리의 다른 글
백준_1717 집합의 표현 (유니온파인드) (0) | 2024.02.16 |
---|---|
백준_2251 물통 (BFS) (0) | 2024.02.15 |
백준_1325 효율적인 해킹 (BFS) (0) | 2024.02.13 |
백준_18352 특정 거리의 도시 찾기 (BFS) (0) | 2024.02.11 |
백준_21568 Ax+By=C (확장 유클리드 호제법) (1) | 2024.02.10 |