Cod sursa(job #1988021)

Utilizator victoreVictor Popa victore Data 1 iunie 2017 21:21:25
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

const int inf=1e9;
const int nmax=50005;

struct el
{
    int to,cost;
};

vector<el>g[nmax];
int n,m,dist[nmax];
bool viz[nmax];
class cmp
{
    public:
        bool operator()(el a,el b)
        {
            return a.cost>b.cost;
        }
};
priority_queue<el,vector<el>,cmp> heap;
int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    int i,x;
    el temp;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        dist[i]=inf;
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&temp.to,&temp.cost);
        g[x].push_back(temp);
    }

    int node,cost;
    dist[1]=0;
    temp.to=1;
    temp.cost=0;
    heap.push(temp);
    int sz,currnode,currcost;
    while(!heap.empty())
    {
        node=heap.top().to;
        cost=heap.top().cost;
        viz[node]=1;
        heap.pop();
        sz=g[node].size();
        for(i=0;i<sz;++i)
        {
            currnode=g[node][i].to;
            currcost=g[node][i].cost;
            if(viz[currnode]==0&&dist[node]+currcost<dist[currnode])
            {
                dist[currnode]=dist[node]+currcost;
                temp.cost=currcost;
                temp.to=currnode;
                heap.push(temp);
            }
        }
    }
    for(i=2;i<=n;i++)
    {
        if(dist[i]==inf)
            printf("0 ");
        else
            printf("%d ",dist[i]);
    }
}