Cod sursa(job #1407456)

Utilizator AndreiBadeciAndrei Badeci AndreiBadeci Data 29 martie 2015 18:46:38
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
#define MAX 50003
#define INFINITE (1<<30)
using namespace std;

//ifstream fin("dijkstra.in");
//ofstream fout("dijkstra.out");

vector < pair <int,int> > la[MAX];

int d[MAX],n,m;

class cmp
{
public:
    bool operator()(pair<int, int> a, pair<int, int> b)
    {
        return a.second>b.second;
    }
};

priority_queue<pair<int, int>,vector<pair<int, int> >,cmp> pq;

void citire()
{
    freopen("dijkstra.in", "r", stdin);
    scanf("%d%d", &n, &m);
    //fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d", &u, &v, &w);
        //fin>>u>>v>>w;
        la[u].push_back(make_pair(v,w));
    }
}

void dijkstra(int nod)
{
    int u,v,w, dist;
    for(int i=1;i<=n;i++) d[i]=INFINITE;
    d[nod]=0;
    pq.push(make_pair(nod, 0));

    while(!pq.empty())
    {
        u=pq.top().first;
        dist = pq.top().second;
        pq.pop();
        if(d[u]==dist)
        for(unsigned i=0;i<la[u].size();i++)
        {
            v=la[u][i].first;
            w=la[u][i].second;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                pq.push(make_pair(v, d[v]));
            }
        }

    }

}

void afis()
{
    freopen("dijkstra.out", "w", stdout);
    for(int i=2;i<=n;i++)
        if(d[i]==INFINITE)
            printf("0 ");
        else
            printf("%d ", d[i]);
}

int main()
{
    citire();
    dijkstra(1);
    afis();
}