본문 바로가기

BOJ/C++

[BOJ] 트리인가?

[문제]

https://www.acmicpc.net/problem/6416

 

6416번: 트리인가?

문제 트리는 굉장히 잘 알려진 자료 구조이다. 트리를 만족하는 자료 구조는 비어 있거나(노드의 개수가 0개), 노드의 개수가 1개 이상이고 방향 간선이 존재하며 다음과 같은 조건을 만족해야 한다. 이때, 노드 u에서 노드 v로 가는 간선이 존재하면 간선을 u에 대해서는 '나가는 간선', v에 대해서는 '들어오는 간선'이라고 하자. 들어오는 간선이 하나도 없는 단 하나의 노드가 존재한다. 이를 루트(root) 노드라고 부른다. 루트 노드를 제외한 모든 노드

www.acmicpc.net

[풀이]

6416 맞았습니다!! 1992 0 C++14 / 수정 822 45초 전

 

1) 트리의 성질 

노드의 개수  = 간선의 개수 +1 (루트는 나가는 간선밖에 없음)

간선이 하나도 없더라도 트리이다. (루트만 존재하는 경우)

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <vector>
#include <set>
 
using namespace std;
 
//# 트리인가?
 
typedef pair<intint> pp;
 
vector<pp> edges;
//노드는 간선 +1 
 
set<int> s;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    //u, v가 존재하는데 간선의 정보는 u-> v이다. 
    int u, v, idx = 1;
    while (1) {
        cin >> u >> v;
 
        if (u == 0 && v == 0){
            //트리인지 판단한다. 
 
            if (edges.size() + 1 == s.size() || edges.size() == 0) {
                cout << "Case " << idx << " is a tree.\n";
            }
            else {
                cout << "Case " << idx << " is not a tree.\n";
            }
            idx++;
            s.clear(); edges.clear();
        }
        else if (u == -1 && v == -1break;
        else {
            //벡터에 간선 정보를 넣음 
            s.insert(u);
            s.insert(v);
            edges.push_back(pp(u, v));
 
        }
        //입력 그만 
        
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'BOJ > C++' 카테고리의 다른 글

[BOJ] 줄세우기  (0) 2019.08.09
[BOJ] 집합의 표현  (0) 2019.08.09
[BOJ] 이진검색 트리  (0) 2019.08.09
[BOJ] 트리순회  (0) 2019.08.09
[BOJ] 캐슬디펜스  (0) 2019.08.08