Cod sursa(job #1197602)

Utilizator xtreme77Patrick Sava xtreme77 Data 12 iunie 2014 21:13:27
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>

using namespace std;

#define IN  "dijkstra.in"
#define OUT "dijkstra.out"
#define rint register int
#define pb push_back
#define mp make_pair
#define s second
#define f first

const int MAX = 50014;
const int INF = 1<<30;
typedef pair<int,int> P;
vector <P> gr[MAX];
int d[MAX];
struct cmp{
    bool operator()(const P &a ,const P &b)
    {
        return (a.second>b.second);
    }
};
priority_queue <P,vector<P>,cmp> h;
void dijkstra (int nod);
int main()
{
    int n,e;
    freopen(IN, "r", stdin);
    freopen(OUT, "w", stdout);
    scanf("%d%d", &n, &e);
    while(e--){
        int x,y,cost;
        scanf("%d%d%d", &x ,&y ,&cost);
        gr[x].pb(mp(y,cost));
    }
    for(rint i=2;i<=n;d[i]=INF,++i);
    dijkstra(1);
    for(rint i=2;i<=n;++i)printf("%d ",(d[i]==INF)?0:d[i]);
    return 0;
}
void dijkstra (int nod){
    h.push(mp(1,0));
    d[1]=0;
    while(!h.empty()){
        int fata=h.top().f;
        int cf=h.top().s;
        h.pop();
        for(rint i=0;i<(int)gr[fata].size();++i)
        if(gr[fata][i].s+cf<d[gr[fata][i].f]){
            d[gr[fata][i].f]=cf+gr[fata][i].s;
            h.push(mp(gr[fata][i].f,d[gr[fata][i].f]));
        }
    }
}