Minimum steps to color the tree with given colors
Given a tree with N nodes which initially have no color and an array color[] of size N which represent the color of each node after the coloring process takes place. The task is to color the tree into the given colors using the smallest possible number of steps. On each step, one can choose a vertex v and a color x, and then color all vertices in the sub-tree of v (including v itself) with color x. Note that root is vertex number 1.
Examples:
Input: color[] = { 1, 1, 2, 1, 3, 1}
Output: 4
Color the sub-tree rooted at node 1 with color 1.
Then all the vertices have colors 1.
Now, color the sub-tree rooted at 3 with color 2.
Finally, color the sub-trees rooted at 5 and 6 with colors 3 and 1 respectively.
Input: color[] = { 1, 2, 3, 2, 2, 3}
Output: 3
Approach: Call a DFS function at vertex 1 and initially keep answer as zero. Increment the answer whenever there is a difference in colors of child and parent nodes.
See the below code for better understanding.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // To store the required answer int ans = 0; // To store the graph vector< int > gr[100005]; // Function to add edges void Add_Edge( int u, int v) { gr[u].push_back(v); gr[v].push_back(u); } // Dfs function void dfs( int child, int par, int color[]) { // When there is difference in colors if (color[child] != color[par]) ans++; // For all it's child nodes for ( auto it : gr[child]) { if (it == par) continue ; dfs(it, child, color); } } // Driver code int main() { // Here zero is for parent of node 1 int color[] = { 0, 1, 2, 3, 2, 2, 3 }; // Adding edges in the graph Add_Edge(1, 2); Add_Edge(1, 3); Add_Edge(2, 4); Add_Edge(2, 5); Add_Edge(3, 6); // Dfs call dfs(1, 0, color); // Required answer cout << ans; return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { // To store the required answer static int ans = 0 ; // To store the graph static Vector<Vector<Integer>> gr = new Vector<Vector<Integer>>(); // Function to add edges static void Add_Edge( int u, int v) { gr.get(u).add(v); gr.get(v).add(u); } // Dfs function static void dfs( int child, int par, int color[]) { // When there is difference in colors if (color[child] != color[par]) ans++; // For all it's child nodes for ( int i = 0 ; i < gr.get(child).size(); i++) { if (gr.get(child).get(i) == par) continue ; dfs(gr.get(child).get(i), child, color); } } // Driver code public static void main(String args[]) { for ( int i = 0 ; i <= 10 ; i++) gr.add( new Vector<Integer>()); // Here zero is for parent of node 1 int color[] = { 0 , 1 , 2 , 3 , 2 , 2 , 3 }; // Adding edges in the graph Add_Edge( 1 , 2 ); Add_Edge( 1 , 3 ); Add_Edge( 2 , 4 ); Add_Edge( 2 , 5 ); Add_Edge( 3 , 6 ); // Dfs call dfs( 1 , 0 , color); // Required answer System.out.println( ans); } } // This code is contributed by Arnab Kundu |
Python3
# Python3 implementation of the approach # To store the required answer ans = 0 # To store the graph gr = [[] for i in range ( 100005 )] # Function to add edges def Add_Edge(u, v): gr[u].append(v) gr[v].append(u) # Dfs function def dfs(child, par, color): global ans # When there is difference in colors if (color[child] ! = color[par]): ans + = 1 # For all it's child nodes for it in gr[child]: if (it = = par): continue dfs(it, child, color) # Driver code # Here zero is for parent of node 1 color = [ 0 , 1 , 2 , 3 , 2 , 2 , 3 ] # Adding edges in the graph Add_Edge( 1 , 2 ) Add_Edge( 1 , 3 ) Add_Edge( 2 , 4 ) Add_Edge( 2 , 5 ) Add_Edge( 3 , 6 ) # Dfs call dfs( 1 , 0 , color) # Required answer print (ans) # This code is contributed # by mohit kumar |
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG { // To store the required answer static int ans = 0; // To store the graph static List<List< int >> gr = new List<List< int >>(); // Function to add edges static void Add_Edge( int u, int v) { gr[u].Add(v); gr[v].Add(u); } // Dfs function static void dfs( int child, int par, int []color) { // When there is difference in colors if (color[child] != color[par]) ans++; // For all it's child nodes for ( int i = 0; i < gr[child].Count; i++) { if (gr[child][i] == par) continue ; dfs(gr[child][i], child, color); } } // Driver code public static void Main(String []args) { for ( int i = 0; i <= 10; i++) gr.Add( new List< int >()); // Here zero is for parent of node 1 int []color = { 0, 1, 2, 3, 2, 2, 3 }; // Adding edges in the graph Add_Edge(1, 2); Add_Edge(1, 3); Add_Edge(2, 4); Add_Edge(2, 5); Add_Edge(3, 6); // Dfs call dfs(1, 0, color); // Required answer Console.WriteLine( ans); } } // This code has been contributed by 29AjayKumar |
Javascript
<script> // Javascript implementation of the approach // To store the required answer let ans = 0; // To store the graph let gr = []; // Function to add edges function Add_Edge(u,v) { gr[u].push(v); gr[v].push(u); } // Dfs function function dfs(child,par,color) { // When there is difference in colors if (color[child] != color[par]) ans++; // For all it's child nodes for (let i = 0; i < gr[child].length; i++) { if (gr[child][i] == par) continue ; dfs(gr[child][i], child, color); } } // Driver code for (let i = 0; i <= 10; i++) gr.push([]); // Here zero is for parent of node 1 let color = [ 0, 1, 2, 3, 2, 2, 3 ]; // Adding edges in the graph Add_Edge(1, 2); Add_Edge(1, 3); Add_Edge(2, 4); Add_Edge(2, 5); Add_Edge(3, 6); // Dfs call dfs(1, 0, color); // Required answer document.write( ans); // This code is contributed by unknown2108 </script> |
3
Please Login to comment...