Cod sursa(job #2398722)

Utilizator andreimotaAndrei Mota andreimota Data 5 aprilie 2019 23:10:05
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#define INF 100000

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

void citire(int p[105][105])
{
    int i,j;

    while(f >> i >> j)
    {
        f >> p[i][j];
    }
}

void initializare(int n, int x, int p[105][105], int d[105])
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            p[i][j] = INF;

    for(int i = 1; i <= n; i++)
        p[i][i] = 0;

    for(int i = 0; i <= n; i++)
    {
        d[i] = INF;
    }

    d[x] = 0;
}

void Dijkstra(int n, int x, int p[105][105],int d[105], int vizitat[105])
{
    int crt = x;

    while(d[crt] != INF)
    {
        crt = 0;

        for(int i = 1; i <= n; i++)
            if(d[i] < d[crt] && !vizitat[i]) crt = i;
        vizitat[crt] = 1;

        for(int i = 1; i <= n; i++)
        {
            if(p[crt][i] + d[crt] < d[i])
            {
                d[i] = p[crt][i] + d[crt];
            }
        }
    }

}

void afisare(int n, int d[105])
{
    for(int i = 2; i <= n; i++)
        if(d[i] == INF) g << 0 << " ";
        else g << d[i] << " ";

}

int main()
{
    int n,x,crt,p[105][105],vizitat[105] = {0},t[105] = {0},d[105];

    f >> n;
    x = 1;
    initializare(n,x,p,d);
    citire(p);
    Dijkstra(n,x,p,d,vizitat);
    afisare(n,d);
    return 0;
}