Skip to content

Instantly share code, notes, and snippets.

@merkurii
Created April 2, 2014 09:28
Show Gist options
  • Select an option

  • Save merkurii/9930860 to your computer and use it in GitHub Desktop.

Select an option

Save merkurii/9930860 to your computer and use it in GitHub Desktop.
City = Struct.new(:name, :neighbours, :way)
def solution(k, t)
n = t.size-1
q = []
path = [k]
for i in (0..n) do
q << City.new(i, [], [])
end
for i in (0..n) do
if i != t[i] #&& i != k
q[i].neighbours << t[i]
q[t[i]].neighbours << i
end
end
corner_q = q.select { |i| i.neighbours.size == 1 }
stack = [k]
visited = []
visited[k] = 1
while !stack.empty? do
v = stack.pop
q[v].neighbours.each do |i|
if visited[i] != 1
visited[i] = 1
if v != k
q[i].way = q[v].way + [v]
end
stack << i
end
end
end
set = []
corner_q.
sort! do |a, b|
if a.way.size == b.way.size
b.name <=> a.name
else
a.way.size <=> b.way.size
end
end.
reverse.
each do |city|
city.way -= set
set += city.way
end
corner_q.
sort! do |a, b|
if a.way.size == b.way.size
b.name <=> a.name
else
a.way.size <=> b.way.size
end
end
path += corner_q.map(&:name).reverse
path.uniq
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment