어흥
[백준 3780] 네트워크 연결 (C++) 본문
728x90
    
    
  반응형
    
    
    
  문제 링크: https://www.acmicpc.net/problem/3780
3780번: 네트워크 연결
문제 종빈이는 아주 큰 그룹의 총수다. 이 그룹은 1부터 N번까지의 번호로 구분할 수 있는 N개의 기업을 운영하고 있다. 현재 각 기업은 서로 독립적인 자체 컴퓨팅 및 통신센터를 가지고 있다. ��
www.acmicpc.net
1. 주의할 점
- TLE가 안나도록 잘 짜야 한다
- 새로운 간선을 연결할때만 1000으로 나눈 나머지 거리로 입력한다
2. 구현
- Find_parent(x) 함수를 통해 X의 센터에서부터 X까지의 거리를 구하여 갱신한다. 기존에 1->2->4였고 4->6이 새로 추가 됐다고 가정한다. 그리고 E 1을 입력한 경우, Dist[1], Dist[2]가 새로 갱신된다. Dist[4]의 경우 새로운 간선을 추가할 때 갱신되어 다시 갱신되지는 않는다
- Make_union(a,b) 함수를 통해 A->B의 간선을 만들며 이때 간선의 길이는 두 Idx의 차이%1000이다. 이후 Par[a]=b를 통해 Par[a]에는 A의 센터를 입력하는것이 아닌, 바로 위인 B와 연결한다
- E를 입력받았을 때마다 Find_parent() 함수를 호출하여 Dist가 갱신될 수 있도록 한다
#include <iostream>
#include <algorithm>
using namespace std;
int par[20001];
int dist[20001];
int node;
int find_parent(int x) {
	if (par[x] == x) return x;
	int idx = find_parent(par[x]);
	dist[x] += dist[par[x]];
	return par[x] = idx;
}
void make_union(int a, int b) {
	dist[a] = abs(a - b) % 1000;
	par[a] = b;
}
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int test, a, b;
	cin >> test;
	for (int t = 0; t < test; t++) {
		cin >> node;
		for (int i = 1; i <= node; i++) {
			par[i] = i;
			dist[i] = 0;
		}
		char c;
		while (1) {
			cin >> c;
			if (c == 'O') break;
			else if (c == 'E') {
				cin >> a;
				find_parent(a);
				cout << dist[a] << '\n';
			}
			else if (c == 'I') {
				cin >> a >> b;
				make_union(a, b);
			}
		}
	}
	system("pause");
	return 0;
}728x90
    
    
  반응형
    
    
    
  '알고리즘 > 백준' 카테고리의 다른 글
| [백준 1941] 소문난 칠공주 (C++) (0) | 2020.05.15 | 
|---|---|
| [백준 16137] 견우와 직녀 (C++) (0) | 2020.05.15 | 
| [백준 1774] 우주신과의 교감 (C++) (0) | 2020.05.14 | 
| [백준 2468] 안전 영역 (Java) (0) | 2020.05.14 | 
| [백준 6497] 전력난 (C++) (0) | 2020.05.13 | 
			  Comments