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

aaaa lo arboles no tienen que ser dirigidos

Cita:
Iniciado por Wikipedia
more specifically graph theory, a tree is an undirected graph in which any two vertices are connected by exactly one simple path. In other words, any connected graph without simple cycles is a tree
http://en.wikipedia.org/wiki/Tree_(graph_theory)

Cita:
Menores a la izquierda, mayores a la derecha....
En este caso, la semántica de los nodos viene dada por el hecho de que los números son ordenables por "mayor" y "menor", y eso define la dirección.
Aqui estas ablando de Binary tree que es otro tema oO entonces si que tienen que ser ordenados. Numeros menores a izquierda y menores a derecha y cada nodo puede tener 2 hijos como mucho... pero eso es Binary Tree, y no estamos hablando de el...

Lo del nodo 7. la verdad es que ni me entere de como lo hiciste root, tirando lo hacia arriba ... si lo tiras hacia arriba cambias todas las conexiones y todo el arbol asi que aqui a lo mejor no te entendi yo bien por eso no lo mencione.

Por cierto aqui tienes el codigo, que elimina las direcciones de espejismo:

Código PHP:
<?php

class NodePaths
{
    private 
$VisitedNodes = array();
    private 
$MaxSum 0;
    private 
$nodeList = array();
    private 
$longestPath "";
    private 
$foundedPaths = array();
    
    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);
                echo 
"<br />";
            }
        }
        
        return array(
"MaxSum" => $this->MaxSum"MaxPath" => $this->longestPath);
    }
    
    private function 
LongestPathDFS(Node $node$currentSum, array $path = array())
    {
        
$this->VisitedNodes[] = $node->value;
        
$currentSum += $node->value;
        
$path[] = $node->value;
        
        if(
$node->NumberOfChildren() == 1)
        {
            
// skip mirror effect
            
if(!in_array(implode(","array_reverse($path)), $this->foundedPaths) && 
               !
in_array(implode(","$path), $this->foundedPaths) && 
               
count($path) > 1)
            {
                
$this->foundedPaths[] = implode(","$path);
                echo 
"["implode("," ,$path) . "]";
            }
        }
        
        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 implode(","$path);
        }
    }
}


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

echo 
"Max Path: " $pathResult["MaxPath"] . "(" $pathResult["MaxSum"] . ")<br />";
?>
Resultado:

Código:
[3,11,5,1,8,7][3,11,5,1,8,6][3,11,5,1,8,4][3,11,2,15]
[7,8,1,5,11,2,15][7,8,6][7,8,4]
[6,8,1,5,11,2,15][6,8,4]
[15,2,11,5,1,8,4]

Max Path: 7,8,1,5,11,2,15(49)