Estou tentando encontrar um método eficiente para detectar se um determinado gráfico G tem duas árvores abrangentes mínimas diferentes. Também estou tentando encontrar um método para verificar se ele possui três árvores abrangentes mínimas diferentes. A solução ingênua que pensei é executar o algoritmo de Kruskal uma vez e encontrar o peso total da árvore de abrangência mínima. Posteriormente, removendo uma aresta do gráfico e executando o algoritmo de Kruskal novamente e verificando se o peso da nova árvore é o peso da árvore de abrangência mínima original e o mesmo para cada aresta no gráfico. O tempo de execução é O (| V || E | log | V |), o que não é bom, e acho que há uma maneira melhor de fazê-lo.
Qualquer sugestão seria útil, obrigado antecipadamente
Respostas:
Kapoor & Ramesh ( versão apropriada do SIAM J. Comput. , Versão gratuita (?) Do site pessoal ) fornecem um algoritmo para enumerar todas as árvores abrangentes mínimas nos gráficos ponderados e não ponderados.
Meu entendimento da idéia básica é que você comece com um MST e depois troque as arestas que se estendem ao longo dos ciclos no gráfico (desde que os pesos estejam corretos, você está substituindo uma aresta por outra que você sabe que reconectará a árvore) .
Para o caso ponderado, eles fornecem um tempo de execução para listar todas as árvores abrangentes mínimas de que N é o número dessas árvores abrangidas. Ele os enumera em ordem crescente de peso, e meu entendimento atual (superficial) sugere que é perfeitamente viável finalizar o algoritmo após a geração de um determinado número de árvores (como ele apenas começa com o MST e as produz sequencialmente).O(N⋅|V|) N
fonte
Pode-se mostrar que o algoritmo de Kruskal pode encontrar todas as árvores de abrangência mínimas; veja aqui .
Portanto, você pode executar o Kruskal e, sempre que tiver várias arestas para escolher, ramificar.
Depois de ramificar vezes, você sabe que existem pelo menos k diferentes árvores de abrangência mínima.k k Infelizmente, várias ramificações podem resultar na mesma árvore adicionando arestas do mesmo peso em ordens diferentes, portanto, isso não ajuda muito sem mais trabalho / insight.fonte
Para verificar se há mais de um MST, considere, por exemplo, o algoritmo de Kruskal. A única maneira de construir diferentes MSTs é deixando de fora as arestas, escolhendo outra quando houver várias com o mesmo peso. Mas essas arestas com o mesmo peso podem ter sido descartadas porque formaram um ciclo com arestas mais claras ...
Portanto, você deve executar o algoritmo de Kruskal e, quando houver várias arestas com o mesmo peso a considerar, adicione todas elas que possam ser adicionadas sem criar ciclos. Se sobrar uma aresta desse peso e não fechar um ciclo com nenhuma das arestas com pesos mais baixos (que foram adicionados antes), haverá mais de um MST. Verificar se há exatamente 2 ou 3 ou mais, etc., parece muito mais difícil ...
fonte
Modificando o algoritmo de Kruskal: Ao ordenar as arestas, agrupe as arestas com o mesmo peso. Agora, no ponto em que você processa as arestas em ordem, sempre que atingir um novo cluster, verifique primeiro todas as arestas separadamente e remova do cluster aquelas que fechariam um ciclo, considerando o que foi construído antes do cluster. Em seguida, execute todas as bordas restantes no cluster agora tentando adicioná-las ao MST. Se algum deles fecha um ciclo, isso foi necessariamente por causa de outras arestas do mesmo cluster inseridas anteriormente, o que significa que você tem mais de um MST.
Essa solução preserva a complexidade do algoritmo de Kruskal, mas aumenta o tempo de cada borda processada.
fonte