Cod sursa(job #1113704)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 20 februarie 2014 20:33:58
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <utility>
#include <set>
#define INF 51000000
using namespace std;
struct vecini
{
    vector <int> nod;
    vector <int> val;
};
multiset< pair <int,int> >  h;
multiset< pair <int,int> >::iterator it;
vecini g[50009];
int rasp[50009];
int main()
{
    int n,m,x,y,z,i,nod_cur;pair <int , int> aux;
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d",&n);
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        g[x].nod.push_back(y);
        g[x].val.push_back(z);
    }
    rasp[1]=0;
    aux.first=0;
    aux.second=1;
    h.insert(aux);
    for(i=2;i<=n;i++)
    {
        rasp[i]=INF;
        aux.first=INF;
        aux.second=i;
        h.insert(aux);
    }
    nod_cur=1;
    while(h.empty()==0)
    {
        for(i=0;i<g[nod_cur].nod.size();i++)
        {
            if(rasp[nod_cur]+g[nod_cur].val[i]<rasp[g[nod_cur].nod[i]])
            {
                aux.first=rasp[g[nod_cur].nod[i]];
                aux.second=g[nod_cur].nod[i];
                h.erase(aux);
                rasp[g[nod_cur].nod[i]]=rasp[nod_cur]+g[nod_cur].val[i];
                aux.first=rasp[g[nod_cur].nod[i]];
                h.insert(aux);
            }
        }
        aux=*h.begin();
        h.erase(aux);
        aux=*h.begin();
        nod_cur=aux.second;
    }
    for(i=2;i<=n;i++)
    {
        if(rasp[i]==INF)
            printf("%d ",0);
        else
            printf("%d ",rasp[i]);
    }
    return 0;
}