Cod sursa(job #593170)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 1 iunie 2011 17:13:35
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

struct edge
{
    int dest,cost;
};

struct cmp
{
    bool operator()(edge i,edge j)
    {
        return i.cost>j.cost;
    }
};

vector <edge> g[50001];
priority_queue <edge,vector <edge>,cmp> h;
int vis[50001],v[50001];

int main()
{
    edge aux;
    int a,b,c,i,n,m,x,y;
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for (i=1;i<=m;++i)
    {
        scanf("%d %d %d\n",&a,&b,&c);
        aux.cost=c;
        aux.dest=b;
        g[a].push_back(aux);
        aux.dest=a;
        g[b].push_back(aux);
    }
    aux.dest=1;
    aux.cost=0;
    h.push(aux);
    while (!h.empty())
    {
        x=h.top().dest;
        y=h.top().cost;
        v[x]=y;
        vis[x]=1;
        h.pop();
        for (i=0;i<g[x].size();++i)
            if (!vis[g[x][i].dest])
            {
                aux.dest=g[x][i].dest;
                aux.cost=v[x]+g[x][i].cost;
                h.push(aux);
            }
        while (!(h.empty())&&vis[h.top().dest])
            h.pop();
    }
    for (i=2;i<=n;++i)
        printf("%d ",v[i]);
    printf("\n");
    return 0;
}