반응형
https://www.acmicpc.net/problem/3780
3780번: 네트워크 연결
입력은 여러 개의 테스트케이스로 주어진다. 입력의 첫 번째 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스에는 기업의 수를 나타내는 N(4 ≤ N ≤ 20,000)이 주어진다. 다음은 몇
www.acmicpc.net
[ 문제풀이 ]
1. 부모 노드를 저장할 vect 배열을 선언하고, vect[ i ] = i로 초기화합니다.
2. I 커맨드를 입력 받을 때마다 I와 J를 연결해 주고, dist[ I ] = abs(I - J) % 1000으로 갱신해 줍니다.
3. E 커맨드를 입력받을 때마다 Find 함수를 통해 부모 노드를 찾아주고, 각 노드에서 부모 노드까지의 거리를 dist[ num ] 에 저장해 줍니다.
4. dist[ I ]를 출력합니다.
[ 소스코드 ]
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 60 | #include<iostream> using namespace std; int T, N; int vect[20001]; int dist[20001]; pair<int,int> Find(int num) { if (vect[num] == num) return make_pair(num, dist[num]); pair<int,int> temp = Find(vect[num]); vect[num] = temp.first; dist[num] += temp.second; return make_pair(vect[num], dist[num]); } void Union(int I, int J) { vect[I] = J; dist[I] = abs(J - I) % 1000; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> T; while (T--) { cin >> N; for (int i = 1; i <= N; i++) { vect[i] = i; dist[i] = 0; } while (1) { char cmd; cin >> cmd; if (cmd == 'E') { int I; cin >> I; Find(I); cout << dist[I] << '\n'; } else if (cmd == 'I') { int I, J; cin >> I >> J; Union(I, J); } else break; } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 21276번 - 계보 복원가 호석 (C++) (0) | 2023.10.11 |
---|---|
[ 백준 ] 17085번 - 십자가 2개 놓기 (C++) (0) | 2023.10.10 |
[ 백준 ] 20210번 - 파일 탐색기 (C++) (1) | 2023.10.08 |
[ 백준 ] 20120번 - 호반우와 리듬게임 (C++) (1) | 2023.10.07 |
[ 백준 ] 17299번 - 오등큰수 (C++) (1) | 2023.10.06 |