Top 9 트리 색칠 Trust The Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 트리 색칠 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: 트리 색칠 그래프 색칠하기 알고리즘 C, 백준 1693, 백준 1693 java, 백준 색칠하기, 트리 DP, BOJ 2533, 사회망 서비스


Christmas tree and ornaments coloring drawing ㅣ 크리스마스 트리 그리기 색칠하기
Christmas tree and ornaments coloring drawing ㅣ 크리스마스 트리 그리기 색칠하기


[백준] No.1693 – 트리 색칠하기 (C++) – Go, Vantage point

  • Article author: everenew.tistory.com
  • Reviews from users: 29138 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [백준] No.1693 – 트리 색칠하기 (C++) – Go, Vantage point Updating …
  • Most searched keywords: Whether you are looking for [백준] No.1693 – 트리 색칠하기 (C++) – Go, Vantage point Updating 문제 https://www.acmicpc.net/problem/1693 1693번: 트리 색칠하기 n개의 정점으로 이루어진 트리가 있다. 이 트리의 각 정점을 색칠하려고 한다. 색칠을 할 때에는 1, 2, 3, …, n번 색깔 중에 하나로 색칠하여..
  • Table of Contents:
[백준] No.1693 - 트리 색칠하기 (C++) - Go, Vantage point
[백준] No.1693 – 트리 색칠하기 (C++) – Go, Vantage point

Read More

[BOJ] 백준 1693번 트리 색칠하기 (Java)

  • Article author: loosie.tistory.com
  • Reviews from users: 29633 ⭐ Ratings
  • Top rated: 4.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [BOJ] 백준 1693번 트리 색칠하기 (Java) 문제. n개의 정점으로 이루어진 트리가 있다. 이 트리의 각 정점을 색칠하려고 한다. 색칠을 할 때에는 1, 2, 3, …, n번 색깔 중에 하나로 색칠하여야 … …
  • Most searched keywords: Whether you are looking for [BOJ] 백준 1693번 트리 색칠하기 (Java) 문제. n개의 정점으로 이루어진 트리가 있다. 이 트리의 각 정점을 색칠하려고 한다. 색칠을 할 때에는 1, 2, 3, …, n번 색깔 중에 하나로 색칠하여야 … #1693 트리 색칠하기 난이도 : 플레 2 유형 : 트리 DP / DFS 1693번: 트리 색칠하기 n개의 정점으로 이루어진 트리가 있다. 이 트리의 각 정점을 색칠하려고 한다. 색칠을 할 때에는 1, 2, 3, …, n번 색깔 중에..
  • Table of Contents:

#1693 트리 색칠하기

문제 풀이

풀이 코드

태그

‘Dot Algo∙ DSPS’ 관련글

Comments

티스토리툴바

[BOJ] 백준 1693번 트리 색칠하기 (Java)
[BOJ] 백준 1693번 트리 색칠하기 (Java)

Read More

[BOJ1693] 트리 색칠하기 – SangWoo Blog

  • Article author: sangwoo0727.github.io
  • Reviews from users: 7842 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [BOJ1693] 트리 색칠하기 – SangWoo Blog Updating …
  • Most searched keywords: Whether you are looking for [BOJ1693] 트리 색칠하기 – SangWoo Blog Updating 문제 설명문제 링크
  • Table of Contents:

문제 설명

풀이 과정

코드

Gradle을 이용한 멀티 모듈

CleanCode 5 형식 맞추기

NCP 외부 접속 허용하기

[BOJ12886] 돌 그룹

[BOJ1693] 트리 색칠하기 - SangWoo Blog
[BOJ1693] 트리 색칠하기 – SangWoo Blog

Read More

벽난로와 크리스마스 트리 색칠 공부 페이지 근처의 어린이 | Christmas coloring pages, Cool coloring pages, Christmas colors

  • Article author: www.pinterest.com
  • Reviews from users: 18904 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 벽난로와 크리스마스 트리 색칠 공부 페이지 근처의 어린이 | Christmas coloring pages, Cool coloring pages, Christmas colors Updating …
  • Most searched keywords: Whether you are looking for 벽난로와 크리스마스 트리 색칠 공부 페이지 근처의 어린이 | Christmas coloring pages, Cool coloring pages, Christmas colors Updating Jan 18, 2020 – This Pin was discovered by 도희 김. Discover (and save!) your own Pins on Pinterest
  • Table of Contents:
벽난로와 크리스마스 트리 색칠 공부 페이지 근처의 어린이 | Christmas coloring pages, Cool coloring pages, Christmas colors
벽난로와 크리스마스 트리 색칠 공부 페이지 근처의 어린이 | Christmas coloring pages, Cool coloring pages, Christmas colors

Read More

[c++] 백준 1693 – 트리 색칠하기 :: 코린이의 작업공간

  • Article author: kyunstudio.tistory.com
  • Reviews from users: 42988 ⭐ Ratings
  • Top rated: 3.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [c++] 백준 1693 – 트리 색칠하기 :: 코린이의 작업공간 0. [c++] 백준 https://www.acmicpc.net/problem/1693 1. 풀이 처음 풀이는 매우 간단하게 시작했었다. 사실 노드를 칠하는데 2가지 색상이면 충분 … …
  • Most searched keywords: Whether you are looking for [c++] 백준 1693 – 트리 색칠하기 :: 코린이의 작업공간 0. [c++] 백준 https://www.acmicpc.net/problem/1693 1. 풀이 처음 풀이는 매우 간단하게 시작했었다. 사실 노드를 칠하는데 2가지 색상이면 충분 …  0. [c++] 백준 https://www.acmicpc.net/problem/1693  1. 풀이 처음 풀이는 매우 간단하게 시작했었다. 사실 노드를 칠하는데 2가지 색상이면 충분하기에 2가지 색상을 반복해서 칠하는 방법을 고안했었는데,..알고리즘 공부하는김에 정리해서 올리는 블로그입니다.
    조금이나마 도움되셨으면 추천 즐찾 구독 부탁드립니다.
  • Table of Contents:
[c++] 백준 1693 – 트리 색칠하기

티스토리툴바

[c++] 백준 1693 - 트리 색칠하기 :: 코린이의 작업공간
[c++] 백준 1693 – 트리 색칠하기 :: 코린이의 작업공간

Read More


See more articles in the same category here: Top 721 tips update new.

[백준] No.1693 – 트리 색칠하기 (C++)

반응형

문제

https://www.acmicpc.net/problem/1693

풀이

solved.ac 난이도: Platium 3

상당히 해결하기 어려웠던 트리에서의 다이나믹 프로그래밍 문제.

해당 문제의 풀이는 koosaga님 과 BaaaaaaaarkingDog 님의 풀이를 참고하였습니다.

T(N): 반드시 N개의 색을 사용해야 트리를 최소 비용으로 칠할 수 있는 트리들 중에서 최소 노드 개수 라고하자.

반드시 N개의 색을 써야 한다면 루트 노드의 자식 노드들이 모두 1~N-1의 색으로 칠해져 있어 어쩔 수 없이 루트를 N으로 칠하는 경우이다.

이러한 경우, 자식 노드들의 서브 트리도 루트를 해당 수(i)로 칠해야만 하는 트리를 구성하기 때문에

최소 노드 개수 T(N)은 아래와 같이 재귀적으로 표현할 수 있다.

T(1) = 1

T(2) = T(1) + 1 = 2

T(3) = T(2) + T(1) + 1 = ( T(1) + 1 ) + 2 = 4

T(4) = T(3) + T(2) + T(1) + 1 = ( T(2) + T(1) + 1 ) + ( T(1) + 1 ) + T(1) + 1 = 4 + 2 + 1 + 1 = 8

T(N) = T(N-1) + T(N-2) + … + T(2) + T(1) + 1

= 2^(N-2) + 2^(N-3) + … + 2^(1) + 2^0 =

2^(N-1)

이때 뒤에 붙는 + 1은 자기 자신(루트 노드)을 N번 색으로 칠하는 것을 의미한다.

T(N)의 의미를 조금 더 자세히 생각해보자.

위의 식에 따르면 T(3) = 4이다. 이때의 트리는 아래와 같다.

3개의 색으로 칠할 수 있는 최소 노드의 개수는 4개임을 의미한다.

물론 4개의 노드는 아래와 같이 더 작은 비용으로 칠할 수도 있다.

즉, T(N)은 최소의 비용만을 선택함에도 N의 색을 모두 사용해야 하는 최악의 경우이다.

여기서 우리가 T(N) (반드시 N개의 색을 사용해야 트리를 최소 비용으로 칠할 수 있는 트리들 중에서 최소 노드 개수)

을 찾는 이유는 노드의 수가 최대 100,000의 값을 가지기 때문이다.

만약 이를 그대로 dp로 구현한다면 100,000(각각의 노드를) X 100,000(1번 색에서 ~ 모든 색으로 모두 칠해보는 경우) = 10,000,000,000의 터무니없이 큰 경우의 수에서 최소 비용을 찾아보아야 한다.

하지만 T(N)을 알고 있다면 100,000개의 노드를 가능한 최소 비용의 색만을 선택할 때 적어도 몇 개의 색이 필요한지 알 수 있다.

T(N) = 2^(N-1) 이기 때문에 T(18) = 2^(17) = 131,072이다.

따라서 100,000개의 노드는 18개의 색으로도 모든 경우의 최소 비용 트리 구해낼 수 있다.

이후에는 DFS형식으로 최소 비용을 구하는 코드를 작성해 주면 된다.

코드

반응형

[BOJ] 백준 1693번 트리 색칠하기 (Java)

#1693 트리 색칠하기

난이도 : 플레 2

유형 : 트리 DP / DFS

▸ 문제

n개의 정점으로 이루어진 트리가 있다. 이 트리의 각 정점을 색칠하려고 한다. 색칠을 할 때에는 1, 2, 3, …, n번 색깔 중에 하나로 색칠하여야 한다. 각 색깔을 사용하여 한 개의 정점을 색칠할 때마다 1, 2, …, n의 비용이 든다. 즉, i번 색깔로 한 개의 정점을 색칠하면 i만큼의 비용이 든다는 것이다.

또한 정점에 색칠을 할 때에, 주어진 트리 상에서 인접해 있는 서로 다른 두 정점은 서로 다른 색깔로 칠해야 한다. 이를 만족하면서, 전체 정점을 색칠하는데 드는 총 비용을 최소화 하려 한다. 최소 비용을 계산하는 프로그램을 작성하시오.

▸ 입력

첫째 줄에는 정점 및 색깔의 개수 n(1 ≤ n ≤ 100,000)이 주어진다. 다음 n-1개의 줄에는 각 줄에 두 개의 정수로 주어진 트리 상에서 연결되어 있는 두 정점의 번호가 주어진다.

▸ 출력

첫째 줄에 최소 비용을 출력한다.

문제 풀이

최대 정점의 수가 10만개, 색칠할 수 있는 색의 수 최대 10만개-1이다. 브루트포스 알고리즘으로 모든 색을 대입하여 최솟값을 구하면 시간초과가 발생한다. 처음에 리프노드에 1을 색칠하고 주고 부모노드에는 자식노드가 색칠하지 않은 수 중 가장 작은 수를 색칠하는 알고리즘을 작성하였다.

하지만 41%에서 실패했다. ↓

더보기 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; public class Main { static int n; static Map> map; static List[] list; static int[] dp; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); map = new HashMap<>(); list = new ArrayList[n+1]; dp = new int[n+1]; for(int i=1; i(); } StringTokenizer st = null; for(int i=0; i data; if(!map.containsKey(pa)) { data = new HashSet<>(); data.add(dp[idx]); map.put(pa, data); }else { data = map.get(pa); if(data.add(dp[idx])) { map.put(pa, data); } } int nv =0; for(int i=1; i=1, T(i) >= T(i-1) + T(i-2) + … + T(1) 이라고 하자.

최소 비용을 가지는 T(i)의 트리를 그려보면 해당 트리에는 i번의 색을 가진 노드가 하나 존재할 것이다. 그러면 이 트리에 인접한 노드들은 i-1, i-2, i-3, … ,1의 색을 가진다. (인접한 노드가 i-1~1의 색을 모두 가지지 않는다면 위의 노드가 i번 색을 가질 이유가 없다.

T(i)일 경우 서브트리구조는 다음과 같다.

따라서, i색을 가지는 노드의 서브트리의 크기는 최소 T(i-1)이상이다. (여기서, T(i)의 최소트리크기를 minT(i)라 하자.)

minT(1)의 최소 트리 크기는 자기 자신 하나이므로 1,

minT(2)은 minT(1) + 1 = 2,

minT(3)은 minT(1)+minT(2)+1 = 4,

minT(4)은 minT(1)+minT(2)+minT(3)+1 = 8,

… ,

T(i)는 min(T(1…i-1)) + 1 = (2^(i-1)-1) +1 = 2^(i-1)이다.

따라서, T(N)의 최소 트리 크기는 2^(N-1)임을 알 수 있다.

해당 문제의 N의 최댓값은 10만이므로 log2(100,000) = 16.60964… <17이다. 그래서 가지는 색의 경우의 수를 최대 17로 넣고 DFS탐색을 하여 최소비용을 가지는 트리를 구하면 된다. 설계 트리 데이터를 인접리스트에 저장한다. list[a].add(b); list[b].add(a); 트리 순회를 통해 1번 노드를 루트노드를 가지는 트리 데이터로 정제시킨다. makeTreeData(1,-1); 정제된 데이터를 사용하여 DFS탐색을 통해 최소 비용을 가지도록 트리를 색칠해준다. tmp = Math.min(tmp, painting(nxt,i)); dp[cur][color] : cur노드의 서브트리들이 가지는 최소 비용을 더해서 저장한다. dp[cur][color] += tmp; cur노드 서브트리의 최솟값에 해당 노드의 최소비용이 드는 color를 더해준다. dp[cur][color] += color; 이렇게 1번 노드가 1~17색을 가지는 경우를 모두 조사하여 가장 적은 비용이 드는 값을 출력한다. res = Math.min(res, painting(1,c)); 풀이 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.StringTokenizer; public class Main { static int n, INF = 987654321; static List[] list; static List[] tree; static int[][] dp; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); list = new ArrayList[n+1]; tree = new ArrayList[n+1]; for(int i=1; i(); tree[i] = new ArrayList<>(); } StringTokenizer st = null; for(int i=0; i

[c++] 백준 1693 – 트리 색칠하기

반응형

0. [c++] 백준

https://www.acmicpc.net/problem/1693

1. 풀이

처음 풀이는 매우 간단하게 시작했었다. 사실 노드를 칠하는데 2가지 색상이면 충분하기에 2가지 색상을 반복해서 칠하는 방법을 고안했었는데, 예제부터 틀리기에 아닌 것을 깨닫고…

하지만, 이를 칠하는 것에 색이 한정적으로 쓰일 것 같아 조금 찾아보았는데, http://codersbrunch.blogspot.com/2017/07/1693.html를 보니 n개의 노드를 칠하는데 대략 종류의 색밖에 필요 없다는 것을 알 수 있었다.

이를 활용해서 코드를 짜보았다.

우선 동적계획법을 활용하여 코드를 완성하였고, adj[i]는 i와 연결된 노드를 담는 노드인데, 양방향을 전부 담았다.

이렇게 구현한 이유는 처음 입력으로는 root에서 뻗어나가는 방향을 확정시킬 수 없기 때문에 이와같이 만들었다.

원래 이와같이 만들면서 bool visited[]라는 방문을 확인하는 방법을 대게 활용했었는데, 이 대신에 자신이 이전에 어디서 왔는지에 대한 출처를 함수에 추가해주었다.

이를 활용하여 자신이 다시 뒤로 빠져나가는 대참사가 발생하지 않도록 만들어주었다.

2. 소스코드

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #include < iostream > #include < vector > using namespace std ; //adj[i]는 i와 연결된 노드를 담는다. vector < int > adj[ 100001 ]; int cache[ 100001 ][ 19 ]; const int INF = 100000007 ; int Min( int a, int b) { return a < b ? a : b; } int dp( int here, int beforeNode, int color) { //메모이제이션을 활용하자. int & ret = cache[here][color]; //기저 사례 : 이미 색칠이 된 경우 바로 리턴 if (ret ! = 0 ) return ret; int colorSum = 0 ; for ( int i = 0 ; i < adj[here]. size (); i + + ) { int there = adj[here][i]; int min = INF; //이전 노드를 방문하지 않도록 한다. if (there ! = beforeNode) { for ( int nextColor = 1 ; nextColor < = 18 ; nextColor + + ) //다음 노드의 색은 이번 노드의 색과 겹치지 않게 한다. if (color ! = nextColor) min = Min(min, dp(there, here, nextColor)); colorSum + = min; } } return ret = colorSum + color; } int main() { int N,a,b; cin > > N; for ( int i = 1 ; i < N; i + + ) { cin > > a > > b; //인접 노드를 양쪽 모두에 담는다.(방향을 확정시킬 수 없기 때문이다.) //만일 위에서 부터 쫘쫘작 주어진다면, 사실 한쪽만 담아도 상관 없다. adj[a]. push_back (b); adj[b]. push_back (a); } int min = INF; for ( int i = 1 ; i < = 18 ; i + + ) { min = Min(min, dp( 1 , 0 ,i)); } cout < < min; return 0 ; } Colored by Color Scripter cs 3 . 참고 http://codersbrunch.blogspot.com/2017/07/1693.html 질문이나 지적 있으시면 댓글로 남겨주세요~ 도움 되셨으면 하트 꾹! 반응형

So you have finished reading the 트리 색칠 topic article, if you find this article useful, please share it. Thank you very much. See more: 그래프 색칠하기 알고리즘 C, 백준 1693, 백준 1693 java, 백준 색칠하기, 트리 DP, BOJ 2533, 사회망 서비스

Leave a Comment