Cod sursa(job #2016652)

Utilizator BovisioNitica Ionut Bogdan Bovisio Data 29 august 2017 22:10:40
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>

using namespace std;

#define inf 1000000

int n,m,c[10000][10000],d[100000],viz[100000];

void Read()
{
    int aux1,aux2,co;
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%i %i",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i == j)
                c[i][j] = 0;
            else
                c[i][j] = inf;
        }
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%i %i %i",&aux1,&aux2,&co);
        c[aux1][aux2] = co;
    }
}

int minim()
{
    int loc= 0;
    int min = inf;
    for(int i=1;i<=n;i++)
    {
        if(viz[i] == 0 && d[i] != inf)
        {
            if(d[i] < min)
            {
                min = d[i];
                loc = i;
            }
        }
    }
    return loc;
}

void Dijkstra(int nod)
{
    int loc;
    viz[nod] = 1;
    for(int i=1;i<=n;i++)
        d[i] = c[nod][i];

    for(int i=2;i<=n-1;i++)
    {
        loc = minim();
        viz[loc] = 1;
        for(int j=1;j<=n;j++)
        {
            if(viz[j] == 0)
            {
                if(d[j] > c[loc][j] + d[loc])
                {
                    d[j] = c[loc][j] + d[loc];
                }
            }
        }
    }
}

int main()
{
    Read();
    Dijkstra(1);
    for(int i=2;i<=n;i++)
    {
        if(d[i] == inf)
            d[i] = 0;
        printf("%i ",d[i]);
    }
    return 0;
}