Cod sursa(job #1489104)

Utilizator Liviu98Dinca Liviu Liviu98 Data 20 septembrie 2015 16:45:53
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#define NMax 50099
using namespace std;
const int long long INFINIT=99999999;
vector<pair<int,int> > Graf[NMax];
set<pair<int,int> > Heap;
int Dist[NMax],N,M,x,y,z;

void Read()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        Graf[x].push_back(make_pair(y,z));
    }
}

void Initializare()
{
    Heap.insert(make_pair(0,1));
    for(int i=2;i<=N+1;i++)
        Dist[i]=INFINIT;
}

void Dijkstra()
{
    Initializare();
    while(Heap.empty()==false)
    {
        int cost=(*Heap.begin()).first;
        int nod=(*Heap.begin()).second;
        Heap.erase(*(Heap.begin()));
        for(vector<pair<int,int> >::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
        {
            if(Dist[it->first]>Dist[nod]+(it->second))
            {
                Dist[it->first]=Dist[nod]+(it->second);
                Heap.insert(make_pair(it->second,it->first));
            }
        }
    }
}

void Write()
{
    for(int i=2;i<=N;i++)
        if(Dist[i]==INFINIT)
           printf("0");
        else
           printf("%d ",Dist[i]);
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    Read();
    Dijkstra();
    Write();
}