示例#1
0
function shortestPath($vertices, $edges, $sourceVertex)
{
    $leftVertices = $vertices;
    $seenVertices = array();
    $distances[$sourceVertex->guid] = 0;
    $previousVertex = array();
    $i = 0;
    while (count($seenVertices) != count($vertices) && $i++ < count($vertices)) {
        $currentVertex = $vertices[get_key_for_minimum_value($distances, $seenVertices)];
        $seenVertices[$currentVertex->guid] = $currentVertex;
        if (isset($edges[$currentVertex->guid])) {
            foreach ($edges[$currentVertex->guid] as $destinationVertexGuid => $weight) {
                if (!isset($distances[$destinationVertexGuid]) || $distances[$currentVertex->guid] + $weight < $distances[$destinationVertexGuid]) {
                    $distances[$destinationVertexGuid] = $distances[$currentVertex->guid] + $weight;
                    $previousVertex[$destinationVertexGuid] = $currentVertex->guid;
                }
            }
        }
    }
    return $previousVertex;
}
function primsAlgorithm($graph, $sourceVertex)
{
    $vertices = $graph->vertices;
    $edges = $graph->edges;
    $seenVertices = array();
    $distances[$sourceVertex->guid] = 0;
    $previousVertex = array();
    $i = 0;
    while ($i++ < count($vertices)) {
        $currentVertex = $vertices[get_key_for_minimum_value($distances, $seenVertices)];
        $seenVertices[$currentVertex->guid] = $currentVertex;
        if (isset($edges[$currentVertex->guid])) {
            foreach ($edges[$currentVertex->guid] as $destinationVertexGuid => $weight) {
                if (!in_array($vertices[$destinationVertexGuid], $seenVertices) && (!isset($distances[$destinationVertexGuid]) || $weight < $distances[$destinationVertexGuid])) {
                    $distances[$destinationVertexGuid] = $weight;
                    $previousVertex[$destinationVertexGuid] = $currentVertex->guid;
                }
            }
        }
    }
    return $previousVertex;
}