모두 0으로 만들기
https://programmers.co.kr/learn/courses/30/lessons/76503
내가 지금껏 못풀어본 트리 + dfs 문제 유형
못풀었음.
#include <string>
#include <vector>
using namespace std;
long long answer(0);
void dfs(vector<long long> &sum, vector<vector<int>> &edges, int now, int parent)
{
for (int i = 0; i < edges[now].size(); i++)//현재부터 연결된 곳둘
{
if (edges[now][i] != parent)//연결되어 있는 곳이 부모 노드가 아닌 경우에만 dfs로 파고든다.
{
dfs(sum, edges, edges[now][i], now);//dfs로 트리를 파고 들어간다.
}
}
sum[parent] += sum[now];//더이상 파고들어갈 곳이 없음.
answer += abs(sum[now]);
return;//타고들어간 dfs 마지막일경우 반환한다. 트리구조이기 때문에 chk배열이 애초에 필요하지 않다.
}
long long solution(vector<int> a, vector<vector<int>> edges) {
vector<long long> sum(a.size());
for (int i = 0; i < a.size(); i++)
{
sum[i] = a[i];
}
vector<vector<int>> tree(a.size());
for (int i = 0; i < edges.size(); i++)
{
tree[edges[i][0]].emplace_back(edges[i][1]);
tree[edges[i][1]].emplace_back(edges[i][0]);
}
dfs(sum, tree, 0, 0 );//처음 시작하는 노드를 0으로 잡고 시작한다.
int flag(0);
if(sum[0]!=0) return -1;
return answer;
}
int main()
{
//vector<int> vTemp = { 1,5,8,4,6 };
//vector<int> vTemp1;
//vTemp1.assign(vTemp.begin(), vTemp.end());
//장르 100개 미만.
vector<int> vTemp = { -5,0,2,1,2 };
vector<vector<int>> vvTemp = { {0, 1},{3,4},{2,3},{0,3} };
vector<int> vTemp1 = { 0,1,0 };
vector<vector<int>> vvTemp1 = { { 0,1 },{ 1,2 }};
long long lTemp= solution(vTemp, vvTemp);
return 0;
}
[트리]
1. 루트 노드의 부모는 자기 자신
2. 루트 노드는 정해져있지 않음.(0으로 잡고 시작한다)
3. 방문 체크를 할 필요가 없음
왜냐면 트리형태 자체가 재방문을 하지 않기 때문이다.
다만, 연결된 노드에 부모 노드가 포함되므로, 부모 노드가 아닌 노드들만 DFS 에 들어가는 것이 핵심이다.
4. 먼저 최대한 깊이 들어가고, 자식 노드로부터 되돌아가는 과정의 노드에서 문제 요구사항의 업데이트를 한다.
Author And Source
이 문제에 관하여(모두 0으로 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@imalive77/모두-0으로-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)