본문 바로가기
프로그래머스

모두 0으로 만들기 C++

by paysmile 2022. 2. 8.

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