Cod sursa(job #1008472)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 11 octombrie 2013 00:41:25
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <algorithm>
#include <cstring>
#include <bitset>
#include <cstdio>
#include <vector>
#include <queue>

#define v second
#define cost first

using namespace std;
const int inf = 0x3f3f3f3f;
const int Nmax = 500001;

priority_queue< pair <int,int> , vector < pair <int,int> > , greater<pair<int,int> > > Q;
vector< pair <int,int> > lv[ Nmax ];
vector< pair <int,int> > ::iterator it;
bitset< Nmax > viz;

int n,m,D[ Nmax ];

void read_data()
{
    scanf("%d%d",&n,&m);
    int a,b,c;
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        lv[a].push_back(make_pair(c,b));
    }
    memset(D,inf,sizeof(D));
    D[ 1 ] = 0;
}

void dijkstra()
{
    Q.push(make_pair(0,1));
    int k ;
    while(!Q.empty())
    {
        k = Q.top().v;
        viz[ k ] = 1;
        Q.pop();
        for(it = lv[k].begin();it != lv[k].end(); ++it)
            if(D[it->v] > D[k] + it->cost && !viz[it->v])
            {
                D[it->v]=D[k]+it->cost;
                Q.push(make_pair(D[it->v] ,it->v));
            }
    }
}

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

    read_data();
    dijkstra();
    for(int i=2;i<=n;++i)
        if(D[i]!=inf) printf("%d ",D[i]);
        else printf("0 ");
    return 0;
}