Cod sursa(job #1869420)

Utilizator SanteCiolosSante Ciolos SanteCiolos Data 5 februarie 2017 20:01:36
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>

#define N 50001
#define Inf 20001

using namespace std;

int** matriceaCosturilor;
int* drumMin;
int* varfMin;
bool* M;
int n, m;

void init();
void afisare();

int main()
{
    int vMin = 1, dMin = 1;
    init();

    for(int i = 1; i < n; i++)
    {
        dMin = Inf;

        for(int j = 1; j <= n; j++)
        {
            if(!M[j] && drumMin[j] < dMin)
            {
                dMin = drumMin[j];
                vMin = j;
            }
        }

        M[vMin] = true;

        for(int j = 1; j <= n; j++)
        {
            if(!M[j] && drumMin[j] > dMin + matriceaCosturilor[vMin][j])
            {
                drumMin[j] = dMin + matriceaCosturilor[vMin][j];
                varfMin[j] = vMin;
            }
        }
    }

    afisare();

    return 0;
}

void init()
{
    ifstream in("dijkstra.in");
    int x, y, c;

    in >> n >> m;

    matriceaCosturilor = new int*[n];

    for(int i = 1; i <= n; i++)
    {
        matriceaCosturilor[i] = new int[n];
    }

    drumMin = new int[n];
    varfMin = new int[n];
    M = new bool[n];

    for(int i = 1; i <= n; i++)
    {
        for(int j = i; j <= n; j++)
        {
            matriceaCosturilor[i][j] = matriceaCosturilor[j][i] = Inf;
        }
    }

    for(int i = 1; i <= m; i++)
    {
        in >> x >> y >> c;

        matriceaCosturilor[x][y] = c;
    }

    for(int i = 1; i <= n; i++)
    {
        drumMin[i] = matriceaCosturilor[1][i];
    }

    for(int i = 1; i <= n; i++)
    {
        varfMin[i] = 1;
    }

    varfMin[1] = 0;
    M[1] = true;
}

void afisare()
{
    ofstream out("dijkstra.out");

    for(int i = 2; i <= n; i++)
    {
        out << drumMin[i] << " ";
    }
}