어흥
[백준 17073] 나무 위의 빗물 (C++) 본문
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