Cod sursa(job #2604270)

Utilizator lepoartcevPaltineanu Rares-Mihai lepoartcev Data 22 aprilie 2020 12:32:46
Problema Algoritmul lui Dijkstra Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int** initializeMatrix(int n) {

    int** matrix = (int**)malloc(sizeof(int*) * (n + 1));

    for(int i = 0; i <= n; i++) {

        matrix[i] = (int*)malloc(sizeof(int) * (n + 1));
        memset(matrix[i], 0, sizeof(int) * (n + 1));
    }

    return matrix;
}

int* initializeArray(int n, int number) {

    int* array = (int*)malloc(4 * (n + 1));

    for(int i = 0; i <= n; i++)
        array[i] = number;

    return array;
}
void read(FILE* in, int** matrix, int n, int m) {




    int node1, node2, weight;
    for(int i = 0; i < m; i++) {

        fscanf(in, "%d %d %d", &node1, &node2, &weight);
        matrix[node1][node2] = weight;

    }
}

int find(int** matrix, int* visited, int* cost, int n) {

    int node = -1;
    int minCost = 9999999;
    for(int i = 1; i <= n; i++)
        if(visited[i] == 0)
            if(minCost > cost[i]) {

                node = i;
                minCost = cost[i];

            }

    return node;
}

void dijkstra(int** matrix, int n, int* costArray, int* visited, int node) {

    visited[node] = 1;
    for(int i = 1; i <= n; i++) {

        if(visited[i] == 0) {
            if(matrix[node][i] != 0)
                if(costArray[node]  + matrix[node][i] < costArray[i]) {

                    costArray[i] = costArray[node]  + matrix[node][i];
                }
        }
    }

    int nodeNew = find(matrix, visited, costArray, n);

    if(nodeNew != -1)
        dijkstra(matrix, n, costArray, visited, nodeNew);
}

int main() {

    FILE* in = fopen("dijkstra.in", "r");
    FILE* out = fopen("dijkstra.out", "w");
    int n, m;
    fscanf(in, "%d %d", &n, &m);
    int** matrix = initializeMatrix(n);

    read(in, matrix, n, m);

    int* costArray = initializeArray(n, 999999);
    int* visited = initializeArray(n, 0);

    costArray[1] = 0;
    dijkstra(matrix, n, costArray, visited, 1);

    for(int i = 2; i <= n; i++)
        fprintf(out, "%d ", costArray[i]);
    return 0;
}