https://programmers.co.kr/learn/courses/30/lessons/76503
코딩테스트 연습 - 모두 0으로 만들기
각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를 0으로 만들고자 합니다. 임의의 연결된 두 점을 골라서 한쪽은 1 증가시키고, 다른 한
programmers.co.kr
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
const int MAX = 300001;
int root = 0;
vector<int> map[MAX];
int visited[MAX];
long long answer = 0;
vector<long long> v;
void dfs(int parent) {
visited[parent] = true;
for (int i = 0; i < map[parent].size(); i++) {
if (visited[map[parent][i]] == true) continue;
dfs(map[parent][i]);
answer += abs(v[map[parent][i]]);
v[parent] += v[map[parent][i]];
v[map[parent][i]] = 0;
}
}
long long solution(vector<int> a, vector<vector<int>> adges) {
memset(visited, -1, sizeof(visited));
for (int i = 0; i < a.size(); i++) {
v.push_back(a[i]);
}
for (int i = 0; i < adges.size(); i++) {
map[adges[i][0]].push_back(adges[i][1]);
map[adges[i][1]].push_back(adges[i][0]);
}
visited[0] = true;
dfs(0);
if (v[0] != 0) return -1;
else return answer;
}
'프로그래머스' 카테고리의 다른 글
파괴되지 않은 건물 C++ (0) | 2022.02.15 |
---|---|
스타 수열 C++ (0) | 2022.02.11 |
아이템 줍기 C++ (0) | 2022.02.07 |
2 X n 타일링 C++ (0) | 2022.01.30 |
단어 변환 C++ (0) | 2022.01.29 |