Cod sursa(job #1339836)

Utilizator DragodanAlexandraDragodan Alexandra DragodanAlexandra Data 11 februarie 2015 10:50:48
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <limits>
#define INF numeric_limits<int>::max()
#define mp make_pair
#define pb push_back
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
vector< vector< pair<int,int> > > a;
priority_queue< pair<int,int> > q; //coada afurisita
vector<int> d;
int n;
void dijkstra(int st)
{
    d[st]=0;
    q.push(mp(0,st));//introduc nodul in multime
    while(!q.empty())
    {
        int x=q.top().second;
        q.pop();
        for(vector< pair<int,int> >::iterator i=a[x].begin();i!=a[x].end();i++)//parcurg adiacentele lui x
        if(d[x] + i->second < d[i->first])
        {
            d[i->first]=d[x] + i->second;
            q.push(mp(-d[i->first],i->first)); // bag negativ, ca pr e max heap

        }
    }
}
void citire()
{
    int m,x,y,z;
    in>>n>>m;
    a=vector< vector< pair<int,int> > >(n+1);
    d=vector<int>(n+1,INF);
    for(;m;m--)
    {
        in>>x>>y>>z;
        a[x].pb(mp(y,z));
    }
}
void afisare()
{
    for(int i=2;i<=n;i++)
    {
        if(d[i]==INF)d[i]=0;
        out<<d[i]<<' ';
    }
}
int main()
{
    citire();
    dijkstra(1);
    afisare();
    return 0;
}