Cod sursa(job #1582661)

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

int n,m,startNode;
struct muchie{
int y, c;
}aux2;
vector<int> d;
vector<bool> viz;
vector< vector<muchie> > A;
vector<muchie> aux;

void initializare()
{
    int x,y,c;
    cin>>n>>m;
    for(int i=0;i<=n;i++)
        A.push_back(aux);
    d.assign(n+2,Inf);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d", &x, &y, &c);
        aux2.y=y;
        aux2.c=c;
        A[x].push_back(aux2);
        if(x==startNode)
            d[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=0; i<A[im].size(); i++)
                if(!viz[A[im][i].y] && d[A[im][i].y]>d[im]+A[im][i].c)
                    d[A[im][i].y]=d[im]+A[im][i].c;
        }
    }
    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();
}