what algorithm does this use
Records *records = initRecords(graph, startVertex);
while (!isEmpty(records->heap)) {
    HeapNode *min = extractMin(records->heap);
    records->finished[min->edge.toVertex] = true;
    if (min->edge.fromVertex != min->edge.toVertex) {
        addTreeEdge(records, records->numTreeEdges, min->edge.fromVertex, min->edge.toVertex, min->edge.weight);
    }
    AdjList *neighbors = graph->vertices[min->edge.toVertex];
    for (int i = 0; i < neighbors->numNeighbors; i++) {
        if (!records->finished[neighbors->neighbors[i].id]) {
            int newWeight = neighbors->neighbors[i].weight;
            int oldWeight = getWeight(records->heap, neighbors->neighbors[i].id);
            if (newWeight < oldWeight) {
                decreasePriority(records->heap, neighbors->neighbors[i].id, newWeight);
                records->predecessors[neighbors->neighbors[i].id] = min->edge.toVertex;
            }
        }
    }
}
return records->tree;
}