Estou tentando encontrar uma solução eficiente para o meu problema. Vamos supor que eu tenha um gráfico ponderado positivo Gcontendo 100 nós (cada nó esteja numerado) e seja um gráfico acíclico. Portanto, não pode haver borda como 2,2 ou 2,1. Eu tenho uma lista de nós, digamos 10 do gráfico G. Digamos que cada um desses nós também esteja em uma matriz. Estou procurando uma maneira de encontrar o peso total do caminho mais curto do nó 1 ao 100 que passa por pelo menos algum detalhe (digamos 5) desses nós dessa lista.
Para simplificá-lo, considere o gráfico com 6 nós, 0 ... 5, agora os nós 1 e 4 estão marcados como pontos pelos quais poderíamos especificar a passagem. Digamos que os caminhos existentes sejam 0-1-2-5, 0-3-4-5 e 1-4. Agora, digamos que todas as arestas são ponderadas como 5, exceto que 3 a 4 são ponderadas como 1. Se executarmos um algoritmo de caminho mais curto, ele basicamente encontrará o caminho 0-3-4-5, pois é ponderado 11. No entanto, se executarmos um algoritmo especificando a quantidade mínima de pontos especificados e tente a quantidade 2. Em seguida, o algoritmo deve estar executando em 0-1-4-5, que é ponderado como 15.
Eu escrevi assim
shortestPath(destinationNode, minAmount)
if(destinationNode == srcNode && minAmount < 1)
return 0
else if(destinationNode == srcNode && minAmount > 1)
return INFINITY
int destNo = destinationNode get number
int cost = INFINITY
for (int i = 0; i < destNo; i++)
if (d[i][destNo] != null)
int minimumAmountCount = minAmount;
for (int j = 0; j < marked.length(); j++)
if (marked[j] == i)
minimumAmountCount = minimumAmountCount - 1;
cost = MIN(cost, shortestPath(Node(i), minimumAmountCount);
return cost;
Basicamente, chamamos esse algoritmo usando o nó de destino e a quantidade mínima de nós dessa lista. Primeiramente, queremos ter certeza de que essa é uma função recursiva e que deve ter um ponto de parada, que seria quando o destino passado for igual ao nó de origem (que é essencialmente o nó # 0). O segundo caso que precisamos verificar é se visitamos uma quantidade suficiente; portanto, se for menor que 1 (0 ou número negativo), visitamos pontos suficientes e retornamos 0, pois a distância do nó # 0 ao nó # 0 seria 0. Se como não visitamos uma quantidade suficiente, retornamos o infinito para que o algoritmo considere outros caminhos.
Portanto, para que a peça retornada funcione, precisamos definir o número do nó de destino (se considerarmos que temos 100 nós, seria o nó nº 99 no início inicial) e inicializar o custo como infinito.
Em seguida, executamos um loop for que começa de 0 (essencialmente o nó # 0) até o número do nó atual, isso ocorre porque não existem arestas no gráfico. Usando o número do nó, verificamos a partir da matriz se existe um peso existente para esses nós. Se existir, inicializamos uma variável para a quantidade mínima atual e, em seguida, executamos um loop e verificamos se a origem do destino atual está na lista de nós marcados. Se estiver marcado, simplesmente decrementamos o valor mínimo.
Para a etapa final, executamos a função novamente, alterando o destino como a fonte atual e com o valor mínimo atual.
Mas parece muito caro, considerando o fato de que a pior complexidade do loop aninhado leva O (| Node | ^ 2) e a recorrência total levaria O (| Node | ^ 2 * | Edges |). Existe alguma outra solução eficiente para esse problema?