# @param {Integer[]} edges # @param {Integer} node1 # @param {Integer} node2 # @return {Integer} def closest_meeting_node(edges, node1, node2) path_a=[];path_b=[] vis=[] until edges[node1]==-1 break if vis[node1] vis[node1]=1 path_a<<node1 node1=edges[node1] end path_a<<node1 vis=[] until edges[node2]==-1 break if vis[node2] vis[node2]=1 path_b<<node2 node2=edges[node2] end path_b<<node2 path_a.uniq!;path_b.uniq! p path_a,path_b path_i=path_a&path_b p path_i if path_i==[] return -1 end # check actual dist! argmx=mxdist=1<<128 hash_a={};hash_b={} t=-1 path_a.each{|v|hash_a[v]=(t+=1)} t=-1 path_b.each{|v|hash_b[v]=(t+=1)} path_i.each do|v| puts "distance max to %d is %d" % [v,[hash_a[v],hash_b[v]].max] if [hash_a[v],hash_b[v]].max<mxdist mxdist=[hash_a[v],hash_b[v]].max argmx=v elsif [hash_a[v],hash_b[v]].max==mxdist argmx=[argmx,v].min end end argmx end