어흥

[백준 17073] 나무 위의 빗물 (C++) 본문

알고리즘/백준

[백준 17073] 나무 위의 빗물 (C++)

라이언납시오 2020. 3. 7. 21:24
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/17073

 

17073번: 나무 위의 빗물

첫째 줄에 트리의 노드의 수 N과 1번 노드에 고인 물의 양을 의미하는 정수 W가 주어진다. (2 ≤ N ≤ 500,000, 1 ≤ W ≤ 109) 다음 N-1줄에 걸쳐, 트리에 존재하는 간선의 정보가 U V의 형태로 주어진다. (1 ≤ U, V ≤ N​​​​, U ≠ V) 이는 양 끝 정점이 각각 U와 V인 간선이 트리에 존재한다는 의미이다. 입력으로 주어지는 트리는 항상 올바른 연결 트리임이 보장되며, 주어지는 트리의 루트는 항상 1번 정점이다.

www.acmicpc.net

1. 주의할 점

- 출력값에 소숫점 이하수가 10개 있으므로 cout.precision(11)을 통해 출력 형태를 맞춰준다.

- Vector를 통해 해당 Node와 연결되어 있는 Node를 저장한다(Node가 50만개여도 메모리초과가 나지 않으니까 안심하자)

 

2. 구현

- 문제를 요약하면, 입력받는 W를 Tree의 Leaf 수만큼 나눠주면 된다.

- BFS를 통해 접근하며, 시작은 Node 1, Visit[1]=true 로 설정을 한다.

- 이후 해당 Node에 연결되어 있는 다른 Node에 대해 Visit의 값이 False면 True로 바꿔준 후 추가

- 더 이상 추가할 Node가 없는 경우(이미 연결되어 있는 모든 Node들은 Visit값이 True일 때), Leaf로 판단한다

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
vector<int> v[500001];
bool visit[500001] = { false, };
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cout.precision(11);
	int num, a, b, cnt = 0;
	double sum;
	cin >> num >> sum;
	for (int i = 0; i < num - 1; i++) {
		cin >> a >> b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	queue<int> q;
	visit[1] = true;
	q.push(1);
	while (!q.empty()) {
		int cidx = q.front();
		q.pop();
		bool avail = false;
		for (int i = 0; i < v[cidx].size(); i++) {
			int next = v[cidx][i];
			if (visit[next]) continue;
			visit[next] = true;
			q.push(next);
			avail = true;
		}
		if (!avail)	cnt++;
	}
	cout << sum / cnt;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1753] 최단경로 (C++)  (0) 2020.03.08
[백준 14238] 출근 기록 (C++)  (0) 2020.03.08
[백준 11437] LCA (C++)  (0) 2020.03.07
[백준 8978] 올림픽 (C++)  (0) 2020.03.06
[백준 9205] 맥주 마시면서 걸어가기 (C++)  (0) 2020.03.06
Comments