Ver Mensaje Individual
  #16 (permalink)  
Antiguo 08/06/2013, 09:22
Avatar de bulter
bulter
 
Fecha de Ingreso: enero-2008
Mensajes: 137
Antigüedad: 16 años, 4 meses
Puntos: 20
Respuesta: Buscar el camino mas largo

Y nada, practicamente ya esta el problema resuelto.
Haces un DFS a tu arbol y para cada nodo sumas su valor.
Un camino largo seria de Hoja a Hoja. Entonces empezaras de una hoja hasta llegar a otra si la suma es superior a la que tienes la guardas, si no sigues.

En este arbol en concreto pasaria lo siguiente:
Haras un DFS solo a las hojas y pasaras por todos sus caminos de salida es decir:

Cita:
3, 11, 5, 1, 8, 7, 6, 4, 2, 15
7, 8, 1, 5, 11, 3, 2, 15, 6, 4
6, 8, 1, 5, 11, 3, 2, 15, 7, 4
15, 2, 11, 5, 1, 8, 7, 6, 4, 3
4, 8, 1, 5, 11, 3, 2, 15, 7, 6

-------------------------

[3][3, 11][3, 11, 5][3, 11, 5, 1][3, 11, 5, 1, 8][3, 11, 5, 1, 8, 7][3, 11, 5, 1, 8, 6][3, 11, 5, 1, 8, 4][3, 11, 2][3, 11, 2, 15]

[7][7, 8][7, 8, 1][7, 8, 1, 5][7, 8, 1, 5, 11][7, 8, 1, 5, 11, 3][7, 8, 1, 5, 11, 2][7, 8, 1, 5, 11, 2, 15][7, 8, 6][7, 8, 4]

[6][6, 8][6, 8, 1][6, 8, 1, 5][6, 8, 1, 5, 11][6, 8, 1, 5, 11, 3][6, 8, 1, 5, 11, 2][6, 8, 1, 5, 11, 2, 15][6, 8, 7][6, 8, 4]

[15][15, 2][15, 2, 11][15, 2, 11, 5][15, 2, 11, 5, 1][15, 2, 11, 5, 1, 8][15, 2, 11, 5, 1, 8, 7][15, 2, 11, 5, 1, 8, 6][15, 2, 11, 5, 1, 8, 4][15, 2, 11, 3]

[4][4, 8][4, 8, 1][4, 8, 1, 5][4, 8, 1, 5, 11][4, 8, 1, 5, 11, 3][4, 8, 1, 5, 11, 2][4, 8, 1, 5, 11, 2, 15][4, 8, 7][4, 8, 6]
Como tenemos 5 hojas tendramos 5 posibles caminos y en cada camino unas cuantas variaciones.
Digamos la hoja 3. Tenemos los caminos: [3, 11, 2, 15], [3, 11, 5, 1, 8, 7], [3, 11, 5, 1, 8, 6][3, 11, 5, 1, 8, 4] esos son los 4 caminos mas largos de la hoja 3. Bueno y de aqui ya seria cojer el camino mas largo.
Un codigo que se podria utilizar seria:

Código PHP:
<?php
class NodePaths
{
    private 
$VisitedNodes = array();
    private 
$MaxSum 0;
    private 
$nodeList = array();
    private 
$longestPath "";
    
    public function 
__construct(array $nodes)
    {
        
$this->nodeList $nodes;
    }
    
    public function 
GetLongestPath()
    {
        foreach(
$this->nodeList as $node)
        {
            if(
$node->NumberOfChildren() == 1)
            {
                
$this->VisitedNodes = array();
                
$this->LongestPathDFS($node0);
            }
        }
        
        return array(
"MaxSum" => $this->MaxSum"MaxPath" => $this->longestPath);
    }
    
    private function 
LongestPathDFS(Node $node$currentSum$path "")
    {
        
$this->VisitedNodes[] = $node->value;
        
$currentSum += $node->value;
        
$path = (empty($path)) ? $node->value $path ", " $node->value;
        
        
        for(
$i 0$i $node->NumberOfChildren(); $i++)
        {
            if(
in_array($node->GetNode($i)->value$this->VisitedNodes))
            {
                continue;
            }
            
            
$this->LongestPathDFS($node->GetNode($i), $currentSum$path);
        }
        
        if(
$node->NumberOfChildren() == && $currentSum $this->MaxSum)
        {
            
$this->MaxSum $currentSum;
            
$this->longestPath $path;
        }
    }
}


$path = new NodePaths($nodes);
$pathResult $path->GetLongestPath();

echo 
"Max Path: " $pathResult["MaxPath"] . "(" $pathResult["MaxSum"] . ")<br />";
?>
Espero haber me explicado bien :D si hay dudas pregunta :)