-
반응형
https://www.acmicpc.net/problem/4803
4803번: 트리
입력으로 주어진 그래프에 트리가 없다면 "No trees."를, 한 개라면 "There is one tree."를, T개(T > 1)라면 "A forest of T trees."를 테스트 케이스 번호와 함께 출력한다.
www.acmicpc.net
풀이
먼저 그래프를 입력받은뒤, 각 정점마다 bfs를 이용하여 트리를 검사한다. 한 정점에서 연결된 모든 정점들이 사이클이 없다면, tree를 1 증가시키고, 사이클이 존재한다면 tree를 존재하지 않는다. 이 bfs를 이용할때, 이전에 검색했던 정점들의 흔적을 남겨놓고, 다음번에 다시한번 검사하는 일이 없도록 코드를 짜면된다.
시간복잡도
테스트케이스를 T, 각 테스트케이스 마다 정점을 N, 간선을 M이라고 한다면, O(T(N+M))이 된다.
코드
#include<iostream> #include<algorithm> #include<vector> #include<queue> #include<string> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; int c = 1; while (true) { cin >> n >> m; if (n == 0 && m == 0) { break; } vector<int> maze[501]; bool visited[501] = { 0 }; int tree = 0; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; maze[u].push_back(v); maze[v].push_back(u); } for (int i = 1; i <= n; i++) { if (!visited[i]) { visited[i] = true; queue<pair<int,int>> q; q.push({ i,-1 }); bool cycle = false; while (!q.empty()) { int now = q.front().first; int parent = q.front().second; q.pop(); for (int next : maze[now]) { if (next!=parent) { if (visited[next]) { cycle = true; break; } else { q.push({ next,now }); } } } if (cycle) break; } if(!cycle) tree++; } } string answer = ""; if (!tree) { answer = "No trees.\n"; } else if (tree == 1) { answer = "There is one tree.\n"; } else { answer = "A forest of " + to_string(tree) + " trees.\n"; } cout << "Case " << c++ << ": " << answer; } return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 9370번 미확인 도착지 (0) 2021.09.11 [백준OJ] 10799번 쇠막대기 (0) 2021.09.10 [백준OJ] 2015번 수들의 합 4 (0) 2021.09.07 [백준OJ] 19942번 다이어트 (0) 2021.09.06 [백준OJ] 6209번 제자리 멀리뛰기 (0) 2021.09.03 댓글