Cod sursa(job #1111604)

Utilizator a96tudorAvram Tudor a96tudor Data 18 februarie 2014 23:20:50
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 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 2000000000
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=(*H.begin()).first;
        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]) {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;
}