Cod sursa(job #1112137)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 19 februarie 2014 14:37:17
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <vector>
#include <set>
#define mp make_pair
using namespace std;
int i, cost, x, y, N, M, Drum[50100];
vector< pair<int, int> > G[50100];
void dijkstra()
{
    set<pair< int, pair<int,int> > > H;
    vector<pair< int, int > >::iterator it;
    int nrAdaugat=1;

    for (it=G[1].begin(); it!=G[1].end(); it++)
        H.insert(mp( (*it).first, mp( 1, (*it).second ) ) );
    while (nrAdaugat<N)
    {
        set<pair< int, pair<int,int> > >::iterator HBegin= H.begin();
        int cost, x, y;
        H.erase ( H.begin() );
        cost=(*HBegin).first;
        x=(*HBegin).second.first;
        y=(*HBegin).second.second;
        if (Drum[y]==0)
        {
            nrAdaugat++;
            Drum[y]=Drum[x]+cost;
            for (it=G[y].begin(); it!=G[y].end(); it++)
            if (Drum[(*it).second]==0)
            {
                H.insert( mp( (*it).first, mp( y, (*it).second ) ) );
            }
        }
    }
}
int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for (i=1; i<=M; i++)
    {
        scanf("%d%d%d", &x, &y, &cost);
        G[x].push_back(mp( cost, y));
    }
    dijkstra();
    for (i=2; i<=N; i++) printf("%d ", Drum[i]);
    return 0;
}