No meu clube de squash local, há uma escada que funciona da seguinte maneira.
- No início da temporada, construímos uma tabela com o nome de cada membro do clube em uma linha separada.
- Em seguida, escrevemos o número de jogos vencidos e o número de jogos disputados ao lado de cada nome (na forma: vitórias / jogos).
Assim, no início da temporada, a tabela fica assim:
Carol 0/0
Billy 0/0
Alice 0/0
Daffyd 0/0
Quaisquer dois jogadores podem jogar uma partida, com um jogador vencendo. Se o jogador mais próximo da parte inferior da mesa vencer, a posição dos jogadores será alterada. Em seguida, repetimos a etapa 2., atualizando o número de vitórias e jogos ao lado de cada jogador. Por exemplo, se Alice bate em Billy, temos
Carol 0/0
Alice 1/1
Billy 0/1
Daffyd 0/0
Essas partidas acontecem ao longo da temporada e, eventualmente, resultam na lista de jogadores em ordem aproximada de força.
Infelizmente, a atualização acontece de maneira aleatória, para que erros sejam cometidos. Abaixo estão alguns exemplos de tabelas inválidas, ou seja, tabelas que não puderam ser produzidas seguindo corretamente as etapas acima para alguma ordem inicial (esquecemos a ordem que usamos no início da temporada) e a sequência de correspondências e resultados:
Alice 0/1
Billy 1/1
Carol 0/1
Daffyd 0/0
Alice 2/3
Billy 0/1
Carol 0/0
Daffyd 0/0
Alice 1/1
Billy 0/2
Carol 2/2
Daffyd 0/1
Dada uma tabela, como podemos determinar com eficiência se é válida? Poderíamos começar observando o seguinte:
A ordem dos nomes não importa, pois esquecemos a ordem inicial original.
O número total de vitórias deve ser metade da soma do número de jogos disputados. (Isso mostra que o primeiro exemplo acima é inválido.)
- Suponha que a tabela seja válida. Depois, há um multigráfico - um gráfico que admite várias arestas, mas sem loops - com cada vértice correspondente a um jogador e cada aresta a uma partida disputada. Em seguida, o número total de jogos disputados por cada jogador corresponde ao grau do vértice do jogador no gráfico múltiplo. Portanto, se não houver multigráficos com os graus de vértice apropriados, a tabela deverá ser inválida. Por exemplo, não há multigraph com um vértice de grau um e um de grau três, portanto, o segundo exemplo é inválido. [Podemos verificar com eficiência a existência de um tal multigráfico.]
Portanto, temos duas verificações que podemos aplicar para começar, mas isso ainda permite tabelas inválidas, como o terceiro exemplo. Para ver que esta tabela é inválida, podemos trabalhar para trás, esgotando todas as formas possíveis de surgir a tabela.
Eu queria saber se alguém pode pensar em um algoritmo de tempo polinomial (no número de jogadores e no número de jogos) resolvendo esse problema de decisão?