CCCPaste

Dijkstra V1.1

global nodes;

function printPath(points, i)
    if points(1, i) ~= -1 then
        printPath(points, points(1, i));
        //disp(string(i) + " ");
        mprintf("%d ", i);
    end
endfunction

function result=findMin(distance, visited)
    min = 10000, minIndex = 0;
    for i=1:nodes
        if visited(1, i) == 0 & distance(1, i) <= min then
            minIndex = i;
            min = distance(1, i);       
        end
    end
    result = minIndex;
endfunction

function dijkstra(graph, start, target)
    distance = 10000*ones(1, nodes);
    points = zeros(1, nodes);
    visited = zeros(1, nodes);
    distance(1, start) = 0;
    points(1, start) = -1;
    for i=1:nodes-1 
        min = findMin(distance, visited);
        visited(1, min) = 1;
        for j=1:nodes
            if visited(1, j) == 0 & graph(min, j) > 0 & distance(1, min) ~= 10000 & distance(1, min)+graph(min, j) < distance(1, j) then
                distance(1, j) = distance(1, min) + graph(min, j);
                points(1, j) = min;
                if j == target
                    mprintf("Distance from start : %d\n", distance(1, j));
                    mprintf("%d ", start);
                    printPath(points, target);
                    return;
                end
            end
        end
    end
endfunction
   
function [from, to, weight]=split(data, flag)
    splitted = evstr(strsplit(data, " "));
    from = splitted(1, 1);
    to = splitted(2, 1);
    if flag == 1 then
        weight = 1; 
    else
        weight = splitted(3, 1);
    end
endfunction

nodes = input("How many nodes ? ");
graph = zeros(nodes, nodes);
flag = input("Does all edges have the same weight (1.yes, 2. no)? ");
edges = input("How many edges ? ");
if flag == 1 then
    disp("Enter " + string(edges) + " edges (from-to) separated by a white space:");
else
    disp("Enter " + string(edges) + " edges (from-to-weight) separated by a white space:");
end
for i=1:edges
    in = input("", "string");
    [from, to, weight] = split(in, flag);
    graph(from, to) = weight;
    graph(to, from) = weight;   
end
    
startNode = input("Enter initial node : ");
targetNode = input("Enter target node : ");

dijkstra(graph, startNode, targetNode);