Skip to content

Commit cf3a546

Browse files
committed
고다혜: [BOJ] 4803 트리_241219
1 parent eb2e66c commit cf3a546

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

BOJ/1000-5000번/DH_4803.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 트리
6+
*/
7+
8+
public class DH_4803 {
9+
static boolean[] v;
10+
static ArrayList<Integer> adj[];
11+
12+
public static void main(String[] args) throws Exception {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st;
15+
String s = "";
16+
StringBuilder sb = new StringBuilder();
17+
18+
int tc = 1;
19+
while(!(s = br.readLine()).equals("0 0")) {
20+
st = new StringTokenizer(s);
21+
int n = Integer.parseInt(st.nextToken());
22+
int m = Integer.parseInt(st.nextToken());
23+
24+
v = new boolean[n + 1];
25+
adj = new ArrayList[n + 1];
26+
27+
for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList<Integer>();
28+
29+
// 간선 리스트 생성
30+
for(int i = 0; i < m; i++) {
31+
st = new StringTokenizer(br.readLine());
32+
int a = Integer.parseInt(st.nextToken());
33+
int b = Integer.parseInt(st.nextToken());
34+
adj[a].add(b);
35+
adj[b].add(a);
36+
}
37+
38+
// 트리의 개수를 세는 변수
39+
int treeCnt = 0;
40+
41+
for(int i = 1; i < adj.length; i++) {
42+
if(v[i]) continue;
43+
treeCnt += dfs(0, i);
44+
}
45+
46+
sb.append("Case ").append(tc++).append(": ");
47+
if(treeCnt == 0) sb.append("No trees.");
48+
else if(treeCnt == 1) sb.append("There is one tree.");
49+
else sb.append("A forest of ").append(treeCnt).append(" trees.");
50+
sb.append("\n");
51+
}
52+
53+
System.out.print(sb);
54+
}
55+
56+
// 사이클 확인 (사이클이 발생한다면 0, 발생하지 않는다면 1 반환)
57+
// prev: 직전 노드, current: 현재 노드
58+
static int dfs(int prev, int current) {
59+
v[current] = true;
60+
61+
for(int next: adj[current]) {
62+
// 현재 노드를 기준으로 다음 노드로 감
63+
// 양방향 그래프이기 때문에 다음 노드를 갈 때는 직전 노드를 제외한 다음 노드로 가야됨
64+
if(next == prev) continue;
65+
66+
// 이미 방문했던 노드거나, 사이클이 발생한다면 0 반환
67+
if(v[next] || dfs(current, next) == 0) return 0;
68+
}
69+
// 사이클이 발생하지 않는다면 1 반환
70+
return 1;
71+
}
72+
}

0 commit comments

Comments
 (0)