[문제 위치]
https://www.acmicpc.net/problem/4803
[문제 풀이]
이 코드는 무방향 그래프에서 트리의 개수를 세는 프로그램이다. 입력으로 주어지는 그래프가 여러 개일 수 있으며, 각 그래프마다 몇 개의 트리로 이루어져 있는지를 판단한다.
트리란 사이클이 없고 연결된 그래프이며, 정점의 수가 간선 수 + 1이라는 특징을 가진다. 이를 이용해 DFS로 연결 요소를 순회하면서 해당 조건을 만족하면 트리로 판단한다.
각 연결 요소마다 DFS로 정점 수 v와 간선 수 e를 구하고, v == e + 1을 만족하면 트리로 간주해 개수를 센다. 이후 트리의 개수에 따라 "No trees.", "There is one tree.", 또는 "A forest of N trees." 형식으로 결과를 출력한다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
vector<vector<int>> Graph;
vector<int> vt;
int deg[505];
bool check[505];
int n, m, v, e;
void dfs(int x) {
v += 1;
check[x] = true;
vt.push_back(x);
for (int i = 0; i < Graph[x].size(); i++) {
int next = Graph[x][i];
if (!check[next]) dfs(next);
}
}
int main() {
int c = 1;
while (scanf(" %d %d", &n, &m) != -1) {
if (n == 0 && m == 0) return 0;
memset(check, 0, sizeof(check));
memset(deg, 0, sizeof(deg));
Graph.resize(n);
for (int i = 0; i < m; i++) {
int a, b; scanf(" %d %d", &a, &b);
a--; b--;
Graph[a].push_back(b);
Graph[b].push_back(a);
deg[a]++; deg[b]++;
}
int ans = 0;
for (int i = 0; i < n; i++) {
if (check[i]) continue;
v = 0, e = 0;
vt.clear();
dfs(i);
for (int i = 0; i < vt.size(); i++) e += deg[vt[i]];
e /= 2;
if (v == (e + 1)) ans += 1;
}
printf("Case %d: ", c++);
if (ans == 0) puts("No trees.");
else if (ans == 1) puts("There is one tree.");
else printf("A forest of %d trees.\n",ans);
Graph.clear();
}
}
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
[Silver V] 점수 계산 - 2822 (0) | 2025.07.11 |
---|---|
[Bronze I] 이항 계수 - 11050 (4) | 2025.07.09 |
[Gold III] 방 번호 - 1082 (1) | 2025.07.09 |
[Silver V] 성적 통계 (0) | 2025.07.08 |
[Silver V] 임시 반장 정하기 - 1268 (1) | 2025.07.06 |