-1

Please let me know the problem in the code that I implemented. Problem Statement: There are n nodes and m colors to be filled in a Graph g. Assign colors to the nodes such that no two adjacent nodes have same colors and try to evenly distribute the colors among the nodes.

Approach: I am using dfs along with greedy algorithm(to evenly distribute)

Variables: $G is graph of the form: {v1: [v2, v3, v4], v2: [v4, v8], ...}; vertex is the starting vertex of the graph; visited_arr or adj_visited_arr is hash of the form: {v1: "1", v2: "2", ...} where "1", "2", ..., "6" are colors; frequency is hash which keeps the count of the number of times the color has been used in the graph so far. eg.: {"1": 5, "2": 6, "3": 8, ...}

Code:

def dfs(vertex, original_visited_arr, frequency)
  #original_visited_arr is passed as reference
  visited_arr = original_visited_arr.clone
  #sorting colors frequency for evenly distribution
  frequency = frequency.sort_by {|k, v| v}.to_h
  used_colors = []
  $G[vertex].each do |adj_vertex|
    used_colors << visited_arr[adj_vertex]
  end
  #checking the colors which can be used (total colors-colors used by adjacent nodes)
  available_colors = frequency.keys-used_colors
  #if there is no color available to be filled in the node, backtrack!
  if available_colors.length==0
    return nil
  end
  #iterate through the available colors to check which one solves the problem
  available_colors.each do |color|
    visited_arr[vertex] = color
    frequency[color]+=1
    res = true
    #use recursion over each node that is adjacent to the current node
    $G[vertex].each do |adj_vertex|
      if visited_arr[adj_vertex]=="0"
        adj_vertex_visited_arr = dfs(adj_vertex, visited_arr, frequency)
        if !adj_vertex_visited_arr
          res=false
          break
        end
        visited_arr=adj_vertex_visited_arr
      end
    end
    if res
      return visited_arr
    end
    frequency[color]-=1
    visited_arr[vertex] = "0"
  end
  return nil
end

visited_arr = {}
frequency = {"1" => 0, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0}
visited_arr =  dfs(vertex, visited_arr, frequency)

Values: vertex="TRIP-10065"

vertices=["TRIP-10065", "TRIP-10066", "TRIP-10067", "TRIP-10068", "TRIP-10069", "TRIP-10070", "TRIP-10071", "TRIP-10072", "TRIP-10073", "TRIP-10074", "TRIP-10075", "TRIP-10076", "TRIP-10077", "TRIP-10078", "TRIP-10079", "TRIP-10080", "TRIP-10081", "TRIP-10082", "TRIP-10083", "TRIP-10084", "TRIP-10085", "TRIP-10086", "TRIP-10087", "TRIP-10088", "TRIP-10089", "TRIP-10090", "TRIP-10091", "TRIP-10092", "TRIP-10093", "TRIP-10094", "TRIP-10095", "TRIP-10096", "TRIP-10097", "TRIP-10098", "TRIP-10099", "TRIP-10100", "TRIP-10101", "TRIP-10102", "TRIP-10103", "TRIP-10104", "TRIP-10105", "TRIP-10106", "TRIP-10107", "TRIP-10108", "TRIP-10109", "TRIP-10110", "TRIP-10111", "TRIP-10112", "TRIP-10113", "TRIP-10114", "TRIP-10115", "TRIP-10116", "TRIP-10117", "TRIP-10118", "TRIP-10119", "TRIP-10120", "TRIP-10121", "TRIP-10122", "TRIP-10123", "TRIP-10124", "TRIP-10125", "TRIP-10126", "TRIP-10127", "TRIP-10128", "TRIP-10129", "TRIP-10130", "TRIP-10131", "TRIP-10132", "TRIP-10133", "TRIP-10134", "TRIP-10135", "TRIP-10136", "TRIP-10137", "TRIP-10138", "TRIP-10139", "TRIP-10140", "TRIP-10141", "TRIP-10142", "TRIP-10143", "TRIP-10144", "TRIP-10145", "TRIP-10146", "TRIP-10147", "TRIP-10148", "TRIP-10149", "TRIP-10150", "TRIP-10151", "TRIP-10152", "TRIP-10153", "TRIP-10154", "TRIP-10155", "TRIP-10156", "TRIP-10157", "TRIP-10158", "TRIP-10159", "TRIP-10160", "TRIP-10161", "TRIP-10162", "TRIP-10163", "TRIP-10164", "TRIP-10165", "TRIP-10166", "TRIP-10167", "TRIP-10168", "TRIP-10169", "TRIP-10170", "TRIP-10171", "TRIP-10172", "TRIP-10173", "TRIP-10174", "TRIP-10175", "TRIP-10176", "TRIP-10177", "TRIP-10178", "TRIP-10179", "TRIP-10180", "TRIP-10181", "TRIP-10182", "TRIP-10183", "TRIP-10184", "TRIP-10185", "TRIP-10186", "TRIP-10187"]

$G={"TRIP-10122"=>["TRIP-10157", "TRIP-10158", "TRIP-10168", "TRIP-10159", "TRIP-10169", "TRIP-10178", "TRIP-10179"], "TRIP-10091"=>["TRIP-10111", "TRIP-10148", "TRIP-10141", "TRIP-10139", "TRIP-10147", "TRIP-10088", "TRIP-10089"], "TRIP-10119"=>["TRIP-10168", "TRIP-10167", "TRIP-10155", "TRIP-10178", "TRIP-10157", "TRIP-10176", "TRIP-10179"], "TRIP-10118"=>["TRIP-10167", "TRIP-10168", "TRIP-10155", "TRIP-10176", "TRIP-10157", "TRIP-10178", "TRIP-10177"], "TRIP-10125"=>["TRIP-10169", "TRIP-10170", "TRIP-10171", "TRIP-10158", "TRIP-10180", "TRIP-10181", "TRIP-10156"], "TRIP-10097"=>["TRIP-10112", "TRIP-10148", "TRIP-10142", "TRIP-10150", "TRIP-10089", "TRIP-10149", "TRIP-10140"], "TRIP-10136"=>["TRIP-10153", "TRIP-10184", "TRIP-10165", "TRIP-10183", "TRIP-10175", "TRIP-10185", "TRIP-10173"], "TRIP-10130"=>["TRIP-10164", "TRIP-10171", "TRIP-10183", "TRIP-10172", "TRIP-10163", "TRIP-10184", "TRIP-10186"], "TRIP-10068"=>["TRIP-10070", "TRIP-10067", "TRIP-10069", "TRIP-10086", "TRIP-10083", "TRIP-10074", "TRIP-10087"], "TRIP-10094"=>["TRIP-10112", "TRIP-10141", "TRIP-10149", "TRIP-10140", "TRIP-10114", "TRIP-10142", "TRIP-10151"], "TRIP-10067"=>["TRIP-10086", "TRIP-10069", "TRIP-10068", "TRIP-10070", "TRIP-10071", "TRIP-10072", "TRIP-10073"], "TRIP-10103"=>["TRIP-10116", "TRIP-10144", "TRIP-10151", "TRIP-10152", "TRIP-10177", "TRIP-10176", "TRIP-10114"], "TRIP-10088"=>["TRIP-10082", "TRIP-10139", "TRIP-10084", "TRIP-10086", "TRIP-10091", "TRIP-10111", "TRIP-10087"], "TRIP-10144"=>["TRIP-10103", "TRIP-10151", "TRIP-10152", "TRIP-10102", "TRIP-10104", "TRIP-10114", "TRIP-10116"], "TRIP-10073"=>["TRIP-10072", "TRIP-10071", "TRIP-10066", "TRIP-10074", "TRIP-10078", "TRIP-10083", "TRIP-10067"], "TRIP-10137"=>["TRIP-10138", "TRIP-10065", "TRIP-10145", "TRIP-10175", "TRIP-10107", "TRIP-10090", "TRIP-10101"], "TRIP-10072"=>["TRIP-10078", "TRIP-10073", "TRIP-10071", "TRIP-10066", "TRIP-10074", "TRIP-10083", "TRIP-10067"], "TRIP-10128"=>["TRIP-10160", "TRIP-10182", "TRIP-10161", "TRIP-10181", "TRIP-10170", "TRIP-10171", "TRIP-10184", "TRIP-10172", "TRIP-10109", "TRIP-10158", "TRIP-10110", "TRIP-10183"], "TRIP-10158"=>["TRIP-10126", "TRIP-10122", "TRIP-10180", "TRIP-10125", "TRIP-10181", "TRIP-10168", "TRIP-10124", "TRIP-10179", "TRIP-10170", "TRIP-10169", "TRIP-10128", "TRIP-10171"], "TRIP-10092"=>["TRIP-10141", "TRIP-10112", "TRIP-10139", "TRIP-10148", "TRIP-10089", "TRIP-10147", "TRIP-10132", "TRIP-10160", "TRIP-10140", "TRIP-10111", "TRIP-10114", "TRIP-10142"], "TRIP-10161"=>["TRIP-10127", "TRIP-10184", "TRIP-10181", "TRIP-10128", "TRIP-10108", "TRIP-10120", "TRIP-10110", "TRIP-10145", "TRIP-10183", "TRIP-10171", "TRIP-10182", "TRIP-10172"], "TRIP-10153"=>["TRIP-10185", "TRIP-10146", "TRIP-10127", "TRIP-10145", "TRIP-10136", "TRIP-10184", "TRIP-10107", "TRIP-10138", "TRIP-10110", "TRIP-10175", "TRIP-10129", "TRIP-10173"], "TRIP-10083"=>["TRIP-10082", "TRIP-10085", "TRIP-10068", "TRIP-10086", "TRIP-10070", "TRIP-10084", "TRIP-10076", "TRIP-10081", "TRIP-10072", "TRIP-10073", "TRIP-10078", "TRIP-10069"], "TRIP-10112"=>["TRIP-10094", "TRIP-10097", "TRIP-10092", "TRIP-10140", "TRIP-10149", "TRIP-10089", "TRIP-10150", "TRIP-10096", "TRIP-10148", "TRIP-10093", "TRIP-10139", "TRIP-10142"], "TRIP-10173"=>["TRIP-10131", "TRIP-10165", "TRIP-10133", "TRIP-10134", "TRIP-10132", "TRIP-10162", "TRIP-10127", "TRIP-10182", "TRIP-10185", "TRIP-10184", "TRIP-10136", "TRIP-10153"], "TRIP-10168"=>["TRIP-10121", "TRIP-10119", "TRIP-10118", "TRIP-10120", "TRIP-10157", "TRIP-10122", "TRIP-10158", "TRIP-10178", "TRIP-10176", "TRIP-10156", "TRIP-10179", "TRIP-10155"], "TRIP-10116"=>["TRIP-10104", "TRIP-10103", "TRIP-10109", "TRIP-10155", "TRIP-10152", "TRIP-10176", "TRIP-10177", "TRIP-10154", "TRIP-10178", "TRIP-10106", "TRIP-10144", "TRIP-10179"], "TRIP-10070"=>["TRIP-10068", "TRIP-10079", "TRIP-10080", "TRIP-10067", "TRIP-10069", "TRIP-10086", "TRIP-10083", "TRIP-10084", "TRIP-10074", "TRIP-10078", "TRIP-10087", "TRIP-10085"], "TRIP-10114"=>["TRIP-10096", "TRIP-10099", "TRIP-10151", "TRIP-10144", "TRIP-10102", "TRIP-10143", "TRIP-10103", "TRIP-10152", "TRIP-10094", "TRIP-10142", "TRIP-10092", "TRIP-10148"], "TRIP-10181"=>["TRIP-10161", "TRIP-10126", "TRIP-10160", "TRIP-10124", "TRIP-10125", "TRIP-10158", "TRIP-10128", "TRIP-10170", "TRIP-10171", "TRIP-10100", "TRIP-10120", "TRIP-10156"], "TRIP-10148"=>["TRIP-10142", "TRIP-10139", "TRIP-10097", "TRIP-10091", "TRIP-10092", "TRIP-10089", "TRIP-10093", "TRIP-10096", "TRIP-10112", "TRIP-10111", "TRIP-10113", "TRIP-10114"], "TRIP-10167"=>["TRIP-10118", "TRIP-10155", "TRIP-10119", "TRIP-10117", "TRIP-10154", "TRIP-10157", "TRIP-10176", "TRIP-10123", "TRIP-10160", "TRIP-10177", "TRIP-10179", "TRIP-10178"], "TRIP-10157"=>["TRIP-10122", "TRIP-10178", "TRIP-10106", "TRIP-10176", "TRIP-10118", "TRIP-10121", "TRIP-10179", "TRIP-10168", "TRIP-10119", "TRIP-10167", "TRIP-10169", "TRIP-10177"], "TRIP-10139"=>["TRIP-10148", "TRIP-10088", "TRIP-10149", "TRIP-10147", "TRIP-10092", "TRIP-10087", "TRIP-10086", "TRIP-10093", "TRIP-10091", "TRIP-10096", "TRIP-10112", "TRIP-10111"], "TRIP-10155"=>["TRIP-10167", "TRIP-10176", "TRIP-10179", "TRIP-10106", "TRIP-10117", "TRIP-10118", "TRIP-10119", "TRIP-10178", "TRIP-10177", "TRIP-10109", "TRIP-10116", "TRIP-10168"], "TRIP-10145"=>["TRIP-10127", "TRIP-10153", "TRIP-10108", "TRIP-10163", "TRIP-10161", "TRIP-10137", "TRIP-10175", "TRIP-10105", "TRIP-10146", "TRIP-10110", "TRIP-10115", "TRIP-10106"], "TRIP-10163"=>["TRIP-10115", "TRIP-10183", "TRIP-10108", "TRIP-10145", "TRIP-10129", "TRIP-10172", "TRIP-10130", "TRIP-10184", "TRIP-10105", "TRIP-10175", "TRIP-10106", "TRIP-10127"], "TRIP-10111"=>["TRIP-10091", "TRIP-10088", "TRIP-10141", "TRIP-10089", "TRIP-10147", "TRIP-10087", "TRIP-10139", "TRIP-10148", "TRIP-10093", "TRIP-10092"], "TRIP-10117"=>["TRIP-10106", "TRIP-10109", "TRIP-10155", "TRIP-10156", "TRIP-10179", "TRIP-10177", "TRIP-10167", "TRIP-10154", "TRIP-10178", "TRIP-10176"], "TRIP-10132"=>["TRIP-10106", "TRIP-10174", "TRIP-10162", "TRIP-10182", "TRIP-10160", "TRIP-10092", "TRIP-10173", "TRIP-10172", "TRIP-10100", "TRIP-10166"], "TRIP-10134"=>["TRIP-10165", "TRIP-10164", "TRIP-10174", "TRIP-10166", "TRIP-10185", "TRIP-10173", "TRIP-10183", "TRIP-10184", "TRIP-10186", "TRIP-10172"], "TRIP-10087"=>["TRIP-10086", "TRIP-10089", "TRIP-10147", "TRIP-10139", "TRIP-10088", "TRIP-10111", "TRIP-10068", "TRIP-10070", "TRIP-10082", "TRIP-10084"], "TRIP-10156"=>["TRIP-10180", "TRIP-10179", "TRIP-10121", "TRIP-10117", "TRIP-10125", "TRIP-10169", "TRIP-10100", "TRIP-10120", "TRIP-10181", "TRIP-10168"], "TRIP-10129"=>["TRIP-10105", "TRIP-10163", "TRIP-10172", "TRIP-10165", "TRIP-10175", "TRIP-10164", "TRIP-10183", "TRIP-10153", "TRIP-10185", "TRIP-10110"], "TRIP-10085"=>["TRIP-10081", "TRIP-10089", "TRIP-10076", "TRIP-10082", "TRIP-10083", "TRIP-10078", "TRIP-10084", "TRIP-10080", "TRIP-10070", "TRIP-10066"], "TRIP-10082"=>["TRIP-10088", "TRIP-10084", "TRIP-10083", "TRIP-10085", "TRIP-10086", "TRIP-10077", "TRIP-10079", "TRIP-10069", "TRIP-10087", "TRIP-10078"], "TRIP-10140"=>["TRIP-10149", "TRIP-10112", "TRIP-10094", "TRIP-10093", "TRIP-10113", "TRIP-10092", "TRIP-10097", "TRIP-10150", "TRIP-10096", "TRIP-10147"], "TRIP-10076"=>["TRIP-10075", "TRIP-10085", "TRIP-10074", "TRIP-10078", "TRIP-10071", "TRIP-10083", "TRIP-10080", "TRIP-10175", "TRIP-10084", "TRIP-10066"], "TRIP-10121"=>["TRIP-10168", "TRIP-10156", "TRIP-10179", "TRIP-10157", "TRIP-10169"], "TRIP-10098"=>["TRIP-10143", "TRIP-10113", "TRIP-10150", "TRIP-10141", "TRIP-10142"], "TRIP-10107"=>["TRIP-10131", "TRIP-10138", "TRIP-10153", "TRIP-10137", "TRIP-10090"], "TRIP-10133"=>["TRIP-10175", "TRIP-10162", "TRIP-10173", "TRIP-10182", "TRIP-10174"], "TRIP-10099"=>["TRIP-10143", "TRIP-10114", "TRIP-10151", "TRIP-10113", "TRIP-10141", "TRIP-10150"], "TRIP-10108"=>["TRIP-10115", "TRIP-10145", "TRIP-10163", "TRIP-10120", "TRIP-10161", "TRIP-10127"], "TRIP-10104"=>["TRIP-10116", "TRIP-10177", "TRIP-10152", "TRIP-10144", "TRIP-10154", "TRIP-10178"], "TRIP-10100"=>["TRIP-10120", "TRIP-10156", "TRIP-10181", "TRIP-10132", "TRIP-10166", "TRIP-10182"], "TRIP-10090"=>["TRIP-10065", "TRIP-10101", "TRIP-10110", "TRIP-10107", "TRIP-10137", "TRIP-10138"], "TRIP-10186"=>["TRIP-10135", "TRIP-10174", "TRIP-10130", "TRIP-10172", "TRIP-10134", "TRIP-10166"], "TRIP-10066"=>["TRIP-10071", "TRIP-10072", "TRIP-10073", "TRIP-10076", "TRIP-10078", "TRIP-10085"], "TRIP-10138"=>["TRIP-10137", "TRIP-10065", "TRIP-10107", "TRIP-10153", "TRIP-10090", "TRIP-10101"], "TRIP-10126"=>["TRIP-10158", "TRIP-10160", "TRIP-10181", "TRIP-10171"], "TRIP-10146"=>["TRIP-10153", "TRIP-10185", "TRIP-10145", "TRIP-10110"], "TRIP-10101"=>["TRIP-10090", "TRIP-10071", "TRIP-10137", "TRIP-10138"], "TRIP-10135"=>["TRIP-10186", "TRIP-10174", "TRIP-10166", "TRIP-10185"], "TRIP-10102"=>["TRIP-10143", "TRIP-10151", "TRIP-10144", "TRIP-10114"], "TRIP-10077"=>["TRIP-10079", "TRIP-10078", "TRIP-10082", "TRIP-10069"], "TRIP-10141"=>["TRIP-10092", "TRIP-10149", "TRIP-10150", "TRIP-10091", "TRIP-10093", "TRIP-10147", "TRIP-10187", "TRIP-10094", "TRIP-10098", "TRIP-10099", "TRIP-10113", "TRIP-10096", "TRIP-10111"], "TRIP-10096"=>["TRIP-10114", "TRIP-10142", "TRIP-10150", "TRIP-10113", "TRIP-10141", "TRIP-10143", "TRIP-10089", "TRIP-10112", "TRIP-10148", "TRIP-10139", "TRIP-10149", "TRIP-10140", "TRIP-10151"], "TRIP-10113"=>["TRIP-10098", "TRIP-10142", "TRIP-10150", "TRIP-10099", "TRIP-10141", "TRIP-10093", "TRIP-10140", "TRIP-10096", "TRIP-10143", "TRIP-10095", "TRIP-10149", "TRIP-10148", "TRIP-10147"], "TRIP-10171"=>["TRIP-10130", "TRIP-10124", "TRIP-10125", "TRIP-10123", "TRIP-10160", "TRIP-10181", "TRIP-10128", "TRIP-10161", "TRIP-10182", "TRIP-10184", "TRIP-10120", "TRIP-10126", "TRIP-10158"], "TRIP-10089"=>["TRIP-10187", "TRIP-10085", "TRIP-10087", "TRIP-10147", "TRIP-10092", "TRIP-10097", "TRIP-10148", "TRIP-10112", "TRIP-10149", "TRIP-10093", "TRIP-10091", "TRIP-10111", "TRIP-10096"], "TRIP-10177"=>["TRIP-10104", "TRIP-10106", "TRIP-10152", "TRIP-10103", "TRIP-10117", "TRIP-10155", "TRIP-10154", "TRIP-10116", "TRIP-10123", "TRIP-10160", "TRIP-10167", "TRIP-10118", "TRIP-10157"], "TRIP-10182"=>["TRIP-10133", "TRIP-10162", "TRIP-10132", "TRIP-10128", "TRIP-10160", "TRIP-10174", "TRIP-10173", "TRIP-10161", "TRIP-10171", "TRIP-10172", "TRIP-10109", "TRIP-10100", "TRIP-10166"], "TRIP-10095"=>["TRIP-10142", "TRIP-10150", "TRIP-10113"], "TRIP-10065"=>["TRIP-10090", "TRIP-10137", "TRIP-10138"], "TRIP-10187"=>["TRIP-10089", "TRIP-10141", "TRIP-10147"], "TRIP-10124"=>["TRIP-10170", "TRIP-10171", "TRIP-10160", "TRIP-10181", "TRIP-10158", "TRIP-10180", "TRIP-10106", "TRIP-10176"], "TRIP-10143"=>["TRIP-10098", "TRIP-10099", "TRIP-10150", "TRIP-10102", "TRIP-10151", "TRIP-10096", "TRIP-10113", "TRIP-10114"], "TRIP-10162"=>["TRIP-10133", "TRIP-10132", "TRIP-10131", "TRIP-10182", "TRIP-10174", "TRIP-10173", "TRIP-10172", "TRIP-10185"], "TRIP-10071"=>["TRIP-10066", "TRIP-10101", "TRIP-10072", "TRIP-10073", "TRIP-10075", "TRIP-10076", "TRIP-10175", "TRIP-10067"], "TRIP-10074"=>["TRIP-10078", "TRIP-10075", "TRIP-10076", "TRIP-10072", "TRIP-10073", "TRIP-10068", "TRIP-10070", "TRIP-10086"], "TRIP-10075"=>["TRIP-10076", "TRIP-10074", "TRIP-10078", "TRIP-10080", "TRIP-10081", "TRIP-10071", "TRIP-10084", "TRIP-10175"], "TRIP-10081"=>["TRIP-10085", "TRIP-10079", "TRIP-10078", "TRIP-10075", "TRIP-10080", "TRIP-10083", "TRIP-10084", "TRIP-10069"], "TRIP-10159"=>["TRIP-10179", "TRIP-10178", "TRIP-10123", "TRIP-10170", "TRIP-10180", "TRIP-10176", "TRIP-10169", "TRIP-10122"], "TRIP-10079"=>["TRIP-10077", "TRIP-10070", "TRIP-10081", "TRIP-10080", "TRIP-10078", "TRIP-10082", "TRIP-10069", "TRIP-10084"], "TRIP-10180"=>["TRIP-10156", "TRIP-10158", "TRIP-10125", "TRIP-10123", "TRIP-10159", "TRIP-10124", "TRIP-10170", "TRIP-10169"], "TRIP-10170"=>["TRIP-10125", "TRIP-10124", "TRIP-10123", "TRIP-10159", "TRIP-10181", "TRIP-10128", "TRIP-10158", "TRIP-10180"], "TRIP-10152"=>["TRIP-10103", "TRIP-10144", "TRIP-10106", "TRIP-10177", "TRIP-10104", "TRIP-10176", "TRIP-10116", "TRIP-10114"], "TRIP-10123"=>["TRIP-10159", "TRIP-10170", "TRIP-10160", "TRIP-10171", "TRIP-10180", "TRIP-10178", "TRIP-10176", "TRIP-10169", "TRIP-10167", "TRIP-10177", "TRIP-10179"], "TRIP-10084"=>["TRIP-10082", "TRIP-10080", "TRIP-10088", "TRIP-10070", "TRIP-10083", "TRIP-10075", "TRIP-10081", "TRIP-10085", "TRIP-10087", "TRIP-10076", "TRIP-10079"], "TRIP-10093"=>["TRIP-10142", "TRIP-10141", "TRIP-10147", "TRIP-10139", "TRIP-10148", "TRIP-10113", "TRIP-10140", "TRIP-10089", "TRIP-10112", "TRIP-10149", "TRIP-10111"], "TRIP-10174"=>["TRIP-10166", "TRIP-10135", "TRIP-10132", "TRIP-10134", "TRIP-10186", "TRIP-10133", "TRIP-10162", "TRIP-10160", "TRIP-10182", "TRIP-10185", "TRIP-10184"], "TRIP-10169"=>["TRIP-10125", "TRIP-10156", "TRIP-10123", "TRIP-10159", "TRIP-10122", "TRIP-10158", "TRIP-10179", "TRIP-10121", "TRIP-10180", "TRIP-10157", "TRIP-10178"], "TRIP-10164"=>["TRIP-10134", "TRIP-10130", "TRIP-10184", "TRIP-10110", "TRIP-10131", "TRIP-10185", "TRIP-10183", "TRIP-10172", "TRIP-10105", "TRIP-10129", "TRIP-10127"], "TRIP-10149"=>["TRIP-10140", "TRIP-10139", "TRIP-10141", "TRIP-10112", "TRIP-10094", "TRIP-10089", "TRIP-10097", "TRIP-10142", "TRIP-10093", "TRIP-10096", "TRIP-10113"], "TRIP-10150"=>["TRIP-10142", "TRIP-10143", "TRIP-10141", "TRIP-10097", "TRIP-10113", "TRIP-10098", "TRIP-10095", "TRIP-10096", "TRIP-10099", "TRIP-10112", "TRIP-10140"], "TRIP-10147"=>["TRIP-10139", "TRIP-10093", "TRIP-10141", "TRIP-10187", "TRIP-10087", "TRIP-10089", "TRIP-10092", "TRIP-10091", "TRIP-10111", "TRIP-10113", "TRIP-10140"], "TRIP-10086"=>["TRIP-10067", "TRIP-10087", "TRIP-10088", "TRIP-10139", "TRIP-10082", "TRIP-10068", "TRIP-10070", "TRIP-10083", "TRIP-10074"], "TRIP-10120"=>["TRIP-10100", "TRIP-10168", "TRIP-10108", "TRIP-10161", "TRIP-10110", "TRIP-10156", "TRIP-10181", "TRIP-10183", "TRIP-10171"], "TRIP-10115"=>["TRIP-10110", "TRIP-10108", "TRIP-10105", "TRIP-10163", "TRIP-10183", "TRIP-10165", "TRIP-10145", "TRIP-10175", "TRIP-10106"], "TRIP-10069"=>["TRIP-10067", "TRIP-10068", "TRIP-10070", "TRIP-10077", "TRIP-10079", "TRIP-10082", "TRIP-10083", "TRIP-10080", "TRIP-10081"], "TRIP-10131"=>["TRIP-10173", "TRIP-10107", "TRIP-10162", "TRIP-10164", "TRIP-10165", "TRIP-10185", "TRIP-10183", "TRIP-10172", "TRIP-10184"], "TRIP-10166"=>["TRIP-10174", "TRIP-10185", "TRIP-10135", "TRIP-10134", "TRIP-10186", "TRIP-10184", "TRIP-10100", "TRIP-10132", "TRIP-10182"], "TRIP-10105"=>["TRIP-10129", "TRIP-10165", "TRIP-10115", "TRIP-10164", "TRIP-10127", "TRIP-10145", "TRIP-10163", "TRIP-10183", "TRIP-10184"], "TRIP-10109"=>["TRIP-10154", "TRIP-10117", "TRIP-10116", "TRIP-10155", "TRIP-10178", "TRIP-10128", "TRIP-10160", "TRIP-10182", "TRIP-10179"], "TRIP-10154"=>["TRIP-10109", "TRIP-10104", "TRIP-10177", "TRIP-10117", "TRIP-10167", "TRIP-10106", "TRIP-10178", "TRIP-10116", "TRIP-10179"], "TRIP-10080"=>["TRIP-10084", "TRIP-10070", "TRIP-10079", "TRIP-10075", "TRIP-10081", "TRIP-10076", "TRIP-10078", "TRIP-10085", "TRIP-10069"], "TRIP-10151"=>["TRIP-10103", "TRIP-10144", "TRIP-10102", "TRIP-10143", "TRIP-10099", "TRIP-10114", "TRIP-10096", "TRIP-10094", "TRIP-10142"], "TRIP-10142"=>["TRIP-10148", "TRIP-10093", "TRIP-10150", "TRIP-10097", "TRIP-10113", "TRIP-10095", "TRIP-10096", "TRIP-10098", "TRIP-10149", "TRIP-10112", "TRIP-10094", "TRIP-10114", "TRIP-10151", "TRIP-10092"], "TRIP-10078"=>["TRIP-10077", "TRIP-10072", "TRIP-10074", "TRIP-10079", "TRIP-10081", "TRIP-10075", "TRIP-10076", "TRIP-10080", "TRIP-10073", "TRIP-10083", "TRIP-10070", "TRIP-10085", "TRIP-10082", "TRIP-10066"], "TRIP-10106"=>["TRIP-10117", "TRIP-10132", "TRIP-10152", "TRIP-10177", "TRIP-10155", "TRIP-10157", "TRIP-10176", "TRIP-10154", "TRIP-10115", "TRIP-10145", "TRIP-10163", "TRIP-10124", "TRIP-10160", "TRIP-10116"], "TRIP-10165"=>["TRIP-10134", "TRIP-10184", "TRIP-10105", "TRIP-10173", "TRIP-10131", "TRIP-10185", "TRIP-10136", "TRIP-10183", "TRIP-10129", "TRIP-10175", "TRIP-10110", "TRIP-10115", "TRIP-10127", "TRIP-10172"], "TRIP-10110"=>["TRIP-10115", "TRIP-10090", "TRIP-10164", "TRIP-10165", "TRIP-10120", "TRIP-10161", "TRIP-10127", "TRIP-10145", "TRIP-10153", "TRIP-10183", "TRIP-10129", "TRIP-10128", "TRIP-10146", "TRIP-10185"], "TRIP-10127"=>["TRIP-10161", "TRIP-10172", "TRIP-10145", "TRIP-10153", "TRIP-10105", "TRIP-10164", "TRIP-10165", "TRIP-10173", "TRIP-10110", "TRIP-10175", "TRIP-10185", "TRIP-10184", "TRIP-10108", "TRIP-10163", "TRIP-10183"], "TRIP-10175"=>["TRIP-10133", "TRIP-10129", "TRIP-10165", "TRIP-10137", "TRIP-10145", "TRIP-10136", "TRIP-10153", "TRIP-10185", "TRIP-10127", "TRIP-10115", "TRIP-10163", "TRIP-10183", "TRIP-10071", "TRIP-10075", "TRIP-10076"], "TRIP-10160"=>["TRIP-10126", "TRIP-10181", "TRIP-10124", "TRIP-10123", "TRIP-10171", "TRIP-10128", "TRIP-10182", "TRIP-10132", "TRIP-10092", "TRIP-10174", "TRIP-10106", "TRIP-10176", "TRIP-10167", "TRIP-10177", "TRIP-10109"], "TRIP-10178"=>["TRIP-10159", "TRIP-10157", "TRIP-10123", "TRIP-10119", "TRIP-10155", "TRIP-10109", "TRIP-10154", "TRIP-10168", "TRIP-10122", "TRIP-10118", "TRIP-10117", "TRIP-10104", "TRIP-10116", "TRIP-10167", "TRIP-10169"], "TRIP-10176"=>["TRIP-10155", "TRIP-10106", "TRIP-10157", "TRIP-10152", "TRIP-10118", "TRIP-10103", "TRIP-10123", "TRIP-10159", "TRIP-10116", "TRIP-10119", "TRIP-10168", "TRIP-10117", "TRIP-10167", "TRIP-10124", "TRIP-10160"], "TRIP-10183"=>["TRIP-10115", "TRIP-10163", "TRIP-10130", "TRIP-10164", "TRIP-10136", "TRIP-10165", "TRIP-10134", "TRIP-10129", "TRIP-10131", "TRIP-10105", "TRIP-10110", "TRIP-10120", "TRIP-10161", "TRIP-10175", "TRIP-10128", "TRIP-10127"], "TRIP-10179"=>["TRIP-10159", "TRIP-10156", "TRIP-10155", "TRIP-10121", "TRIP-10117", "TRIP-10157", "TRIP-10122", "TRIP-10158", "TRIP-10168", "TRIP-10169", "TRIP-10119", "TRIP-10167", "TRIP-10123", "TRIP-10109", "TRIP-10116", "TRIP-10154"], "TRIP-10172"=>["TRIP-10127", "TRIP-10130", "TRIP-10164", "TRIP-10129", "TRIP-10163", "TRIP-10186", "TRIP-10131", "TRIP-10162", "TRIP-10185", "TRIP-10134", "TRIP-10165", "TRIP-10184", "TRIP-10128", "TRIP-10161", "TRIP-10132", "TRIP-10182"], "TRIP-10184"=>["TRIP-10165", "TRIP-10164", "TRIP-10161", "TRIP-10136", "TRIP-10153", "TRIP-10130", "TRIP-10163", "TRIP-10134", "TRIP-10105", "TRIP-10127", "TRIP-10172", "TRIP-10173", "TRIP-10128", "TRIP-10171", "TRIP-10166", "TRIP-10174", "TRIP-10131"], "TRIP-10185"=>["TRIP-10166", "TRIP-10153", "TRIP-10146", "TRIP-10131", "TRIP-10165", "TRIP-10164", "TRIP-10134", "TRIP-10136", "TRIP-10175", "TRIP-10127", "TRIP-10162", "TRIP-10172", "TRIP-10173", "TRIP-10135", "TRIP-10174", "TRIP-10129", "TRIP-10110"]}

krnbatta
  • 497
  • 5
  • 17
  • `in '
    ': undefined local variable or method 'vertex'` It would be easier for us to help if we can copy-paste a working code.
    – BernardK Nov 21 '17 at 12:11
  • @BernardK When i replace `frequency = frequency.sort_by {|k, v| v}.to_h` with `frequency = frequency.clone` It works fine. The problem occurs when i try to sort the frequencies in order to evenly distribute. – krnbatta Nov 21 '17 at 20:07
  • $ `ruby -w t.rb` => `t.rb:7: warning: global variable '$H' not initialized`. – BernardK Nov 21 '17 at 22:06
  • If I replace $G by $H, then `undefined local variable or method 'colors' for main:Object` in line `available_colors = colors.keys-used_colors`. – BernardK Nov 21 '17 at 22:23

1 Answers1

0

With two changed lines (marked with # <--------------------) :

require_relative 'trips1' # contains $G={"TRIP-10122"=>...

def dfs(vertex, original_visited_arr, frequency)
  puts "enters dfs with vertex=#{vertex}, vis arr=#{original_visited_arr}, frequency=#{frequency}"
  return nil unless $G[vertex] # <--------------------
  #original_visited_arr is passed as reference
  visited_arr = original_visited_arr.clone
  #sorting colors frequency for evenly distribution
  frequency = frequency.sort_by {|k, v| v}.to_h
  used_colors = []

#  puts $G.keys.sort
  $G[vertex].each do |adj_vertex|
    puts "adj_vertex 1=#{adj_vertex}"
    used_colors << visited_arr[adj_vertex]
  end
  puts "used_colors=#{used_colors}"

  #checking the colors which can be used (total colors-colors used by adjacent nodes)
  available_colors = frequency.keys - used_colors
  puts "available_colors=#{available_colors}"
  #if there is no color available to be filled in the node, backtrack!
  if available_colors.length==0
    return nil
  end

  #iterate through the available colors to check which one solves the problem
  available_colors.each do |color|
    puts "color=#{color}, visited_arr[vertex]=#{visited_arr[vertex].inspect}, vertex=#{vertex}"
    visited_arr[vertex] = color
    frequency[color]+=1
    res = true

    #use recursion over each node that is adjacent to the current node
    $G[vertex].each do |adj_vertex|
      puts "adj_vertex 2=#{adj_vertex}, visited_arr[adj_vertex]=#{visited_arr[adj_vertex].inspect}"
      unless visited_arr[adj_vertex] # <--------------------
        adj_vertex_visited_arr = dfs(adj_vertex, visited_arr, frequency)
        puts "dfs returned #{adj_vertex_visited_arr.inspect}"
        if ! adj_vertex_visited_arr
          res=false
          break
        end
        visited_arr = adj_vertex_visited_arr
      end
    end
    puts "res=#{res}"
    if res
      puts "about to return #{visited_arr}"
      return visited_arr
    end
    frequency[color] -= 1
    visited_arr[vertex] = "0"
  end
  return nil
end

vertex="TRIP-10065"

visited_arr = {}
frequency = {"1" => 0, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0}
visited_arr =  dfs(vertex, visited_arr, frequency)

and trips1 :

$G = {"TRIP-10065"=>["TRIP-10090", "TRIP-10137", "TRIP-10138"],
      "TRIP-10090"=>["TRIP-10065", "TRIP-10101", "TRIP-10110", "TRIP-10107", "TRIP-10137", "TRIP-10138"],
      "TRIP-10137"=>["TRIP-10138", "TRIP-10065", "TRIP-10145", "TRIP-10175", "TRIP-10107", "TRIP-10090", "TRIP-10101"], 
      "TRIP-10138"=>["TRIP-10137", "TRIP-10065", "TRIP-10107", "TRIP-10153", "TRIP-10090", "TRIP-10101"],
     }

Execution :

$ ruby -w t.rb 
enters dfs with vertex=TRIP-10065, vis arr={}, frequency={"1"=>0, "2"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>0}
adj_vertex 1=TRIP-10090
adj_vertex 1=TRIP-10137
adj_vertex 1=TRIP-10138
used_colors=[nil, nil, nil]
available_colors=["1", "2", "3", "4", "5", "6"]
color=1, visited_arr[vertex]=nil, vertex=TRIP-10065
adj_vertex 2=TRIP-10090, visited_arr[adj_vertex]=nil
enters dfs with vertex=TRIP-10090, vis arr={"TRIP-10065"=>"1"}, frequency={"1"=>1, "2"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>0}
adj_vertex 1=TRIP-10065
adj_vertex 1=TRIP-10101
...
available_colors=["1", "3", "4", "5", "6"]
color=1, visited_arr[vertex]=nil, vertex=TRIP-10090
...
color=3, visited_arr[vertex]="0", vertex=TRIP-10090
...
color=4, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
...
color=5, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
....
color=6, visited_arr[vertex]="0", vertex=TRIP-10090
adj_vertex 2=TRIP-10065, visited_arr[adj_vertex]="2"
adj_vertex 2=TRIP-10101, visited_arr[adj_vertex]=nil
enters dfs with vertex=TRIP-10101, vis arr={"TRIP-10065"=>"2", "TRIP-10090"=>"6"}, frequency={"1"=>0, "3"=>0, "4"=>0, "5"=>0, "6"=>1, "2"=>1}
dfs returned nil
res=false
dfs returned nil
res=false
...

It seems there is something wrong with iterating the colours :

available_colors.each do |color|

because it repeats 6 times the same processing.

BernardK
  • 3,674
  • 2
  • 15
  • 10
  • @krnbatta After two changes, I have the feeling it repeats two much times the same processing. Do you have something new ? – BernardK Nov 25 '17 at 16:41