반응형
https://www.acmicpc.net/problem/4343
4343번: Arctic Network
The first line of input contains N, the number of test cases. The first line of each test case contains 1 <= S <= 100, the number of satellite channels, and S < P <= 500, the number of outposts. P lines follow, giving the (x,y) coordinates of each outpost
www.acmicpc.net

[ 문제풀이 ]
1. 부모 노드를 저장할 vect 배열과 연결된 노드의 개수를 저장할 cnt를 선언합니다.
2. vect[ i ] = i로 초기화하고, 각 지점까지의 거리를 arr 배열에 저장합니다.
3. arr 배열을 거리를 기준으로 오름차순으로 정렬합니다.
4. Union-Find를 이용하여 각 지점들을 연결하고, 연결될 때마다 cnt++를 해주고, cnt == P - S일 때 거리를 출력합니다.
[ 소스코드 ]
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include<iostream> #include<algorithm> #include<vector> #include<cmath> using namespace std; struct node { int u, v; double d; }; bool cmp(node left, node right) { return left.d < right.d; } int T, S, P; vector<node> arr; pair<int, int> pos[501]; int vect[501]; int cnt; int Find(int num) { if (vect[num] == num) return num; return vect[num] = Find(vect[num]); } void Union(int u, int v) { int pu = Find(u); int pv = Find(v); vect[pv] = pu; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> T; cout << fixed; cout.precision(2); for (int t = 0; t < T; t++) { cin >> S >> P; arr.clear(); cnt = 0; for (int i = 1; i <= P; i++) { int x, y; cin >> x >> y; pos[i] = { x,y }; vect[i] = i; } for (int i = 1; i <= P - 1; i++) { for (int j = i + 1; j <= P; j++) { int x = pos[i].first - pos[j].first; int y = pos[i].second - pos[j].second; double d = sqrt(x * x + y * y); arr.push_back({ i,j,d }); } } sort(arr.begin(), arr.end(), cmp); for (auto& next : arr) { const int u = next.u; const int v = next.v; const double d = next.d; if (Find(u) != Find(v)) { Union(u, v); cnt++; } if (cnt == P - S) { cout << d << '\n'; break; } } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 2758번 - 로또 (C++) (0) | 2023.08.26 |
---|---|
[ 백준 ] 2580번 - 스도쿠 (C++) (0) | 2023.08.25 |
[ 백준 ] 2463번 - 비용 (C++) (0) | 2023.08.23 |
[ 백준 ] 2479번 - 경로 찾기 (C++) (0) | 2023.08.22 |
[ 백준 ] 2591번 - 숫자카드 (C++) (0) | 2023.08.21 |