Cod sursa(job #667245)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 22 ianuarie 2012 19:25:51
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <queue>
using namespace std;

const int N_MAX = 50010;

const int INF = 1000000000;

struct vcn
{
    int dest; int cost;
};

vector<vcn> vecin[N_MAX]; int n;
int d[N_MAX]; //cost total, ii marchez direct valoarea finala (valorile intermediare zboara prin heap)
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > heap;

void citeste()
{
    int m,a,b,c;
    scanf("%d%d",&n,&m);
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        vecin[a].push_back((vcn){b,c});
    }
}

void initializare_dijkstra(int s)
{
    for (int i = 1; i <= n; ++i)
            d[i] = INF;
    heap.push(make_pair(0,s));
}

void dijkstra(int s)
{
    //golire heap
    initializare_dijkstra(s);
    int nod,c;
    while (!heap.empty())
    {
        nod = heap.top().second;
        c = heap.top().first;
        heap.pop();
        if (d[nod] != INF) //are deja calculata distanta finala, deci am marcat deja in jur cu el
            continue;
        d[nod] = c; //aceasta distanta tentativa dintre toate e minima, deci devine finala si marcheaza in jur
        for (unsigned int i = 0; i < vecin[nod].size(); ++i)
            heap.push(make_pair(c + vecin[nod][i].cost,vecin[nod][i].dest)); //marchez asa in heap distantele tentative
    }
}

void scrie()
{
    for (int i = 2; i <= n; ++i)
        printf("%d ",(d[i] != INF)?d[i]:0);
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    citeste();
    dijkstra(1);
    scrie();
    return 0;
}