示例#1
0
function getMenorCompensacaoDeFluxo($lista, $matrizJusante, $noInicial, $noFinal)
{
    $noVisitado = $noFinal;
    $i = 0;
    while ($i < count($lista)) {
        $sinal = substr($lista[$noVisitado], 0, 1);
        $no = trim(substr($lista[$noVisitado], 1, strlen($lista[$noVisitado])));
        $ponteiro = getPonteiroConexao($no, $noVisitado, $matrizJusante);
        if ($sinal == "+") {
            // SE O NO FOI ROTULADO POSITIVAMENTE
            $diff = $matrizJusante[$ponteiro][2] - $matrizJusante[$ponteiro][3];
            if (empty($menorCompensacao)) {
                $menorCompensacao = $diff;
            } elseif ($noVisitado != $noInicial && $diff <= $menorCompensacao) {
                $menorCompensacao = $diff;
            }
            if ($noVisitado == $noInicial) {
                //Chegou no inicio da lista
                break;
            } else {
                //Ainda não chegou no inicio da lista
                $noVisitado = trim(substr($lista[$noVisitado], 1, strlen($lista[$noVisitado])));
            }
        }
        $i++;
    }
    return $menorCompensacao;
}
 $compensacao = getMenorCompensacaoDeFluxo($lista, $matrizJusante, $noInicial, $noFinal);
 while (count($lista) > 0) {
     $sinalCompensacao = substr($lista[$noVisitado], 0, 1);
     #Localizo o indice da conexao na matriz de jusante analiso a capacidade e o fluxo
     #Analisando o sinal da compensacao e compensando o fluxo alocando e/ou desalocando novos fluxos na matriz de Jusante e montante
     if ($sinalCompensacao == "+") {
         $seta = "->";
         $no = trim(substr($lista[$noVisitado], 1, strlen($lista[$noVisitado])));
         $ponteiroJusante = getPonteiroConexao($no, $noVisitado, $matrizJusante);
         if ($noVisitado != $noInicial) {
             $matrizJusante[$ponteiroJusante][3] += $compensacao;
         }
     } else {
         $seta = "<-";
         $no = trim(substr($lista[$noVisitado], 1, strlen($lista[$noVisitado])));
         $ponteiroJusante = getPonteiroConexao($noVisitado, $no, $matrizJusante);
         $matrizJusante[$ponteiroJusante][3] -= $compensacao;
     }
     $matrizMontante = geraMatrizMontante($matrizJusante);
     //Atualizo a Matriz Montante
     #IMPRIMINDO ROTA FLUXO
     if ($noVisitado == $noInicial) {
         //Chegou no inicio da lista
         $str = $noVisitado . $str;
         break;
     } else {
         //Ainda não chegou no inicio da lista
         $str = $seta . $noVisitado . $str;
         $noVisitado = trim(substr($lista[$noVisitado], 1, strlen($lista[$noVisitado])));
     }
 }