Minimum distance to visit all the nodes of an undirected weighted tree
Given a weighted tree with N nodes starting from 1 to N. The distance between any two nodes is given by the edge weight. Node 1 is the source, the task is to visit all the nodes of the tree with minimum distance traveled.
Examples:
Input:
u[] = {1, 1, 2, 2, 1}
v[] = {2, 3, 5, 6, 4}
w[] = {1, 4, 2, 50, 5}
Output: 73
Input:
u[] = {1, 2}
v[] = {2, 3}
w[] = {3, 1}
Output: 4
Approach: Let’s suppose there are n leaf l1, l2, l3, ……, ln and the cost of the path from root to each leaf is c1, c2, c3, ……, cn.
To travel from l1 to l2 some of the edges will be visited twice ( till the LCA of l1 and l2 all the edges will be visited twice ), for l2 to l3 and some of the edges will be visited ( till the LCA of l2 and l3 all the edges will be visited twice ) twice and similarly every edge of the tree will be visited twice ( observation ).
To minimize the cost of travelling, the maximum cost path from the root to some leaf should be avoided.
Hence the cost = (c1 + c2 + c3 + …… + cn) – max(c1, c2, c3, ……, cn)
min cost = (2 * sum of edge weight) – max(c1, c2, c3, ……, cn)
DFS can be used with some modification to find the largest distance.
Below is the implementation of the above approach:
Java
// Java implementation of the approach import java.util.LinkedList; import java.util.Scanner; class Graph { class Edge { // from - The source of an edge // to - destination of an edge // wt - distance between two nodes int from; int to; long wt; Edge( int a, int b, long w) { from = a; to = b; wt = w; } } // adj_lis - It is used to // make the adjacency list of a tree // V - Total number of nodes in a tree // val - This array stores the // distance from node 1 to node 'n' static LinkedList<Edge>[] adj_lis; static int V; static long val[]; Graph( int v) { this .V = v; adj_lis = new LinkedList[V]; for ( int i = 0 ; i < V; i++) adj_lis[i] = new LinkedList<>(); } // Method to add an edge between two nodes void add_edge( int to, int from, long wt) { adj_lis[from].add( new Edge(from, to, wt)); adj_lis[to].add( new Edge(to, from, wt)); } // DFS method to find distance // between node 1 to other nodes void dfs( int v, int par, long sum, boolean [] visited) { val[v] = sum; visited[v] = true ; for (Edge e : adj_lis[v]) { if (!visited[e.to]) dfs(e.to, v, sum + e.wt, visited); } } // Driver code public static void main(String a[]) { // Number of nodes int v = 6 ; Graph obj = new Graph(v); val = new long [v]; boolean [] visited = new boolean [v]; int sum = 0 ; // Edge from a node to another // node with some weight int from[] = { 2 , 3 , 5 , 6 , 4 }; int to[] = { 1 , 1 , 2 , 2 , 1 }; int wt[] = { 1 , 4 , 2 , 50 , 5 }; for ( int i = 0 ; i < v - 1 ; i++) { sum += 2 * wt[i]; obj.add_edge(to[i] - 1 , from[i] - 1 , wt[i]); } obj.dfs( 0 , - 1 , 0 , visited); long large = Integer.MIN_VALUE; // Loop to find largest // distance in a val. for ( int i = 1 ; i < val.length; i++) if (val[i] > large) large = val[i]; System.out.println(sum - large); } } |
C#
// C# program to implement // the above approach using System; using System.Collections.Generic; class Graph { public class Edge { // from - The source of an edge // to - destination of an edge // wt - distance between two nodes public int from ; public int to; public long wt; public Edge( int a, int b, long w) { from = a; to = b; wt = w; } } // adj_lis - It is used to // make the adjacency list of a tree // V - Total number of nodes in a tree // val - This array stores the // distance from node 1 to node 'n' public static List<Edge>[] adj_lis; public static int V; public static long []val; public Graph( int v) { V = v; adj_lis = new List<Edge>[V]; for ( int i = 0; i < V; i++) adj_lis[i] = new List<Edge>(); } // Method to add an edge between two nodes void add_edge( int to, int from , long wt) { adj_lis[ from ].Add( new Edge( from , to, wt)); adj_lis[to].Add( new Edge(to, from , wt)); } // DFS method to find distance // between node 1 to other nodes void dfs( int v, int par, long sum, bool [] visited) { val[v] = sum; visited[v] = true ; foreach (Edge e in adj_lis[v]) { if (!visited[e.to]) dfs(e.to, v, sum + e.wt, visited); } } // Driver code public static void Main(String []a) { // Number of nodes int v = 6; Graph obj = new Graph(v); val = new long [v]; bool []visited = new bool [v]; int sum = 0; // Edge from a node to another // node with some weight int [] from = { 2, 3, 5, 6, 4 }; int []to = { 1, 1, 2, 2, 1 }; int []wt = { 1, 4, 2, 50, 5 }; for ( int i = 0; i < v - 1; i++) { sum += 2 * wt[i]; obj.add_edge(to[i] - 1, from [i] - 1, wt[i]); } obj.dfs(0, -1, 0, visited); long large = int .MinValue; // Loop to find largest // distance in a val. for ( int i = 1; i < val.Length; i++) if (val[i] > large) large = val[i]; Console.WriteLine(sum - large); } } // This code is contributed by Princi Singh |
73
Recommended Posts:
- Count the nodes of the tree whose weighted string contains a vowel
- Count the nodes of the given tree whose weighted string is a palindrome
- Count the nodes of a tree whose weighted string does not contain any duplicate characters
- Find the root of the sub-tree whose weighted sum XOR with X is minimum
- Find the root of the sub-tree whose weighted sum is minimum
- Count the nodes of a tree whose weighted string is an anagram of the given string
- Find distance between two nodes of a Binary Tree
- Shortest distance between two nodes in an infinite binary tree
- Distance between two nodes of binary tree with node values from 1 to N
- Queries to find distance between two nodes of a Binary tree
- Find distance of nodes from root in a tree for multiple queries
- Queries to find distance between two nodes of a Binary tree - O(logn) method
- Tree with N nodes and K leaves such that distance between farthest leaves is minimized
- Minimum no. of iterations to pass information to all nodes in the tree
- Minimum and maximum node that lies in the path connecting two nodes in a Binary Tree
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.