Cod sursa(job #1582586)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 28 ianuarie 2016 09:31:06
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 50005
#define Inf 1000000000
using namespace std;

int n,m,startNode;
vector<int> d;
vector<bool> viz;
vector< vector<int> > A;

void initializare()
{
    int x,y,i,c;
    cin>>n>>m;
    d.assign(n+2,Inf);
    for(int i=0;i<=n;i++)
        A.push_back(d);

    while(cin>>x>>y>>c)
        A[x][y]=c;

    for(i=1; i<=n; i++)//Distantele initiale de la nodul 1 la celelalte noduri din graf
        d[i]=A[startNode][i];

}

void Dijkstra()
{
    int nrDistanteRezolvate,dmin,im,i;
    viz.assign(n+2,0);
    viz[startNode]=1;
    nrDistanteRezolvate=1;
    do
    {
        dmin=Inf;
        for(i=1; i<=n; i++)
            if(!viz[i] && d[i]<dmin)
            {
                im=i;
                dmin=d[i];
            }
        if(dmin<Inf)
        {
            nrDistanteRezolvate++;
            viz[im]=1;
            for(i=1; i<=n; i++)
                if(!viz[i] && d[i]>d[im]+A[im][i])
                    d[i]=d[im]+A[im][i];
        }
    }
    while(!(dmin==Inf || nrDistanteRezolvate==n));

    for(i=2; i<=n; i++)
        if(d[i]==Inf)
            cout<<0<<' ';
        else
            cout<<d[i]<<' ';
    cout<<'\n';
}

int main()
{
    freopen("dijkstra.in","rt",stdin);
    freopen("dijkstra.out","wt",stdout);

    startNode=1;
    initializare();
    Dijkstra();
}