Eu estive pensando sobre esta questão por um tempo agora.
Vamos dizer que há uma lista s
que contém livros que as pessoas estão vendendo. Eu tenho um livro no s
, e eu quero trocar por um livro que está em s
(algo que eu não tenho).
Cada pessoa neste cenário está vendendo um livro no s
, e também quer um livro que está em s
.
Existe um algoritmo para descobrir o menor número de comércios necessária entre as pessoas a obter o livro que eu quero (e dar o meu livro para as pessoas que querem isso)?
Por favor me diga se isso parece confuso (porque provavelmente é).
Obrigado por responder a pergunta!
EDIT: Lista s
pode crescer a qualquer momento.
Eu transformar isso em um gráfico a seguir. Os livros são os nós do grafo. Você tem uma aresta direcionada de um livro de ao livro B, se alguém em S está oferecendo livro B e quer livro A. Você está procurando o caminho mais curto a partir do livro que você tem que o livro que você realmente quer.
O caminho mais curto pode ser descoberto por uma busca em largura. Você pode implementar um como segue:
todo = [starting_book]
path = {starting_book: None}
while len(todo) and target_book not in path:
book = list.pop(0)
for next_book in neighbors(book):
if next_book not in path:
path[next_book] = book
todo.append(next_book)
if target_book in path:
solution = [target_book]
while solution[-1] != starting_book:
solution.append(path[solution[-1]])
else:
solution = None
Note, a solução que eu estou oferecendo aqui dá o conjunto de comércios livro acontecer, mas não as pessoas. Transformar um livro de volta o comércio em particular na pessoa para falar pode ser feito tanto por busca s
ou com uma tabela de pesquisa.
Isso também não é uma solução online - manter o controle dos caminhos mais curtos como as coisas são adicionados / removidos do s
que vai ser um monte de trabalho.