Cod sursa(job #1111612)

Utilizator a96tudorAvram Tudor a96tudor Data 18 februarie 2014 23:28:56
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<set>
#define ins insert
#define pb push_back
#define mp make_pair
#define N_MAX 50010
#define INF 600000
using namespace std;
multiset < pair <int,int> > H;
vector < pair <int,int> > G[N_MAX];
int D[N_MAX],N;
inline void Dijkstra()
{
    while (!H.empty())
    {
        int Nod=(*H.begin()).second, Cost=D[Nod];
        H.erase(H.begin());
        for (vector < pair <int,int> > :: iterator it=G[Nod].begin();it!=G[Nod].end();++it)
        {
            int nod=(*it).first, cost=(*it).second;
            if (cost + Cost < D[nod])
                    {
                        if (D[nod]!=INF) H.erase(H.find(mp(D[nod],nod)));
                        D[nod]=cost+Cost; H.ins(mp(D[nod],nod));
                    }
        }
    }
}
inline void Load_Data(int &N)
{
    int M,x,y,c;
    scanf("%d%d",&N,&M);
    for (int i=1;i<=M;++i)
        scanf("%d%d%d",&x,&y,&c), G[x].pb(mp(y,c)), G[y].pb(mp(x,c));
    for (int i=1;i<=N;++i) D[i]=INF;
    H.ins(mp(0,1)); D[1]=0;
}
int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    Load_Data(N);
    Dijkstra();
    for (int i=2;i<=N;++i)
        if (D[i]!=INF) printf("%d ",D[i]);
                else printf("0 ");
    printf("\n");
    fclose(stdin); fclose(stdout);
    return 0;
}