티스토리 뷰
노드 u에서 v로 이동하는 경우는 유일하므로 key : v, value : u 로 잡고
'키가 중복으로 들어오는 경우, 트리가 아니다.' 식으로 문제를 풀었다.
그 과정에서 조건들을 꼼꼼히 생각하지 않아 시간이 좀 걸렸다.
- 들어오는 간선이 하나도 없는 단 하나의 노드가 존재한다. 이를 루트(root) 노드라고 부른다.
- 루트 노드를 제외한 모든 노드는 반드시 단 하나의 들어오는 간선이 존재한다.
- 루트에서 다른 노드로 가는 경로는 반드시 가능하며, 유일하다. 이는 루트를 제외한 모든 노드에 성립해야 한다.
풀면서 실패했던 케이스들
1 2 2 1 0 0
양방향으로 간선이 있는 경우
1 2 2 3 3 4 4 1 0 0
루트가 없으므로 트리가 아닌 경우
1 2 3 4 0 0
루트가 두 개 이상인 경우
통과 코드
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 | #include <iostream> #include <map> #include <set> #define FOR(i,a,b) for(int i = a; i < b; i++) #define mp(a,b) make_pair(a,b) using namespace std; int main() { int x, y, t = 1; while (1) { map<int, int> m; set<int> s; bool flag = true; while (1) { cin >> x >> y; if (x < 0 && y < 0) return 0; if (x == 0 && y == 0) break; if (m.count(y) == 0) { if (m.count(x) == 1 && m.at(x) == y) flag = false; else { m.insert(mp(y, x)); s.insert(x); } } else flag = false; } int cnt = 0; for (int root : s) if (m.count(root) == 0) cnt++; if (flag && cnt == 1 || s.empty()) cout << "Case " << t << " is a tree.\n"; else cout << "Case " << t << " is not a tree.\n"; t++; } } | cs |
코드를 더 단순하게 할 수 있을 거 같은데 고민을 해봐야겠다.
반응형
'백준 온라인 저지' 카테고리의 다른 글
190211 BOJ 1722번 순열의 순서 (0) | 2019.02.11 |
---|---|
190209 BOJ 1761번 정점들의 거리 (0) | 2019.02.09 |
190207 BOJ 1753번 최단경로 (0) | 2019.02.07 |
190203 BOJ 2517번 달리기 (0) | 2019.02.03 |
190202 BOJ 5639번 이진 검색 트리 (0) | 2019.02.02 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Fast Campus
- 자료구조
- 컴퓨터공학
- 개발자 취업
- 운영체제
- 프로그래밍 온라인 강의
- c언어
- 올인원 패키지
- 패스트캠퍼스
- 코딩 면접
- #패스트캠퍼스 #프로그래밍대학생서포터즈 #올인원패키지 #컴퓨터공학 #성공하는프로그래밍공부법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함