반응형
https://www.acmicpc.net/problem/16168
16168번: 퍼레이드
첫 번째 줄에 지점의 개수 V, 연결 구간의 개수 E가 주어진다. (1 ≤ V ≤ E ≤ 3000) 이후 E개의 줄에 걸쳐 각 연결 구간이 연결하는 두 지점의 번호 Va, Vb가 공백을 사이에 두고 주어진다. (1 ≤ Va,
www.acmicpc.net
[ 문제풀이 ]
1. 부모 노드를 저장할 vect 배열을 선언합니다.
2. vect[ i ] = i 로 초기화합니다.
3. 퍼레이드 이동이 가능한 경우는 한 붓 그리기가 가능한 경우이므로 한 붓 그리기가 가능한 지 그래프를 그려 판단합니다.
4. 연결된 간선의 수가 홀수인 노드의 개수가 0개 또는 2개일 경우에만 한 붓 그리기가 가능하므로 해당 조건을 만족하는 경우 모든 노드가 연결되어 있다면 YES를 출력하고, 그렇지 않다면 NO를 출력합니다.
[ 소스코드 ]
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 50 51 52 53 54 55 56 57 58 59 | #include<iostream> #include<vector> using namespace std; int V, E; int vect[3001]; vector<int> list[3001]; int Find(int num) { if (vect[num] == num) return num; return vect[num] = Find(vect[num]); } void Union(int a, int b) { int pa = Find(a); int pb = Find(b); vect[pb] = pa; } int main() { scanf("%d %d", &V, &E); for (int i = 1; i <= V; i++) { vect[i] = i; } for (int i = 0; i < E; i++) { int a, b; scanf("%d %d", &a, &b); list[a].push_back(b); list[b].push_back(a); if (Find(a) != Find(b)) { Union(a, b); } } int cnt = 0; int temp = Find(1); if (list[1].size() % 2 == 1) cnt++; for (int i = 2; i <= V; i++) { if (list[i].size() % 2 == 1) cnt++; if (cnt > 2 || temp != Find(i)) { printf("NO"); return 0; } } printf("YES"); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 15816번 - 퀘스트 중인 모험가 (C++) (0) | 2023.06.07 |
---|---|
[ 백준 ] 17398번 - 통신망 분할 (C++) (0) | 2023.06.06 |
[ 백준 ] 12893번 - 적의 적 (C++) (0) | 2023.06.04 |
[ 백준 ] 15789번 - CTP 왕국은 한솔 왕국을 이길 수 있을까? (C++) (0) | 2023.06.03 |
[ 백준 ] 17022번 - Sleepy Cow Sorting (C++) (0) | 2023.06.02 |