길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Tree

[백준 4803번] 트리 (C++)

2022. 6. 4. 01:23

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를 이용하여 해결할 수 있습니다. 

 

알고리즘의 기본 틀은 아래와 같습니다. 

  1. 트리의 방문하지 않은 각 정점부터 시작하여 BFS를 수행
  2. 인접한 정점이 이미 방문했지만, 부모 노드가 아닌 경우 싸이클이 존재한다고 판단. 따라서, 트리가 아니라고 판단.
  3. 인접한 정점이 이미 방문하였고, 부모 노드인 경우 방문을 진행

아래는 전체 코드입니다. 

#include <bits/stdc++.h>
using namespace std;

#define MAX 501
int vis[MAX];   // 방문 표시 배열

bool istree(vector<vector<int>> linked, int st){
    queue<int> q;
    q.push(st);
    vis[st] = 1;

    bool tree = true;
    while(!q.empty()){
        int cur = q.front(); q.pop();

        for(auto nxt : linked[cur]){
            if(vis[nxt] != 0 && vis[nxt] != vis[cur] - 1){   // 인접한 정점이 이미 방문했지만, 부모 노드가 아닌 경우
                tree = false;
            }

            if(vis[nxt] != 0) continue;
            vis[nxt] = vis[cur] + 1;
            q.push(nxt);
        }
    }
    return tree;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int c = 1;
    while(true){
        int n, m; cin >> n >> m;
        if(!n && !m) break;
        vector<vector<int>> linked (n + 1); // 인접 리스트
        for(int i = 0; i < m; i++){ // 인접 리스트 만듦
            int u, v; cin >> u >> v;
            linked[u].push_back(v);
            linked[v].push_back(u);
        }

        fill(vis, vis + MAX, 0);    // 방문 표시 배열 초기화

        int ans = 0;    // 트리의 개수
        for(int st = 1; st <= n; st++){ // 방문하지 않은 정점부터 시작하여 BFS를 수행
            if(vis[st] == 0){
                if(istree(linked, st)) ans++;   // 부분 그래프가 트리인 경우
            }
        }

        cout << "Case " << c++ << ": ";
        if(ans > 1)
            cout << "A forest of " << ans << " trees.";
        else if(ans == 1)
            cout << "There is one tree.";
        else 
            cout << "No trees.";
        cout << "\n";
    }
}

'Algorithm > Tree' 카테고리의 다른 글

[SW Expert Academy 1248번] 공통 조상  (0) 2022.07.03
[백준 20955번] 민서의 응급 수술 (C++)  (0) 2022.06.05
[백준 15681] 트리와 쿼리 (C++)  (0) 2022.06.04
    'Algorithm/Tree' 카테고리의 다른 글
    • [SW Expert Academy 1248번] 공통 조상
    • [백준 20955번] 민서의 응급 수술 (C++)
    • [백준 15681] 트리와 쿼리 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바