Cod sursa(job #3330708)

Utilizator bogdan_barnaBogdan Barna bogdan_barna Data 21 decembrie 2025 13:41:28
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("dijkstra.in");
ofstream fout("dijkstra.out");

typedef priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>> MinHeap;

struct name
{
    int nNodes;
    vector<vector<pair<int,int>>> adj;
    void init (int n){
        nNodes=n;
        adj.assign(n+1,vector<pair<int,int>>());
    }
};

vector<int> dijkstra(name &g,int sak)
{
    MinHeap minheap;
    vector<int> dist(g.nNodes+1,INT_MAX);
    vector<int> prev(g.nNodes+1,-1);
    vector<bool> visited(g.nNodes+1,false);
    
    dist[sak]=0;
    minheap.push({0,sak});
    
    while(!minheap.empty())
    {
        auto[curdist,curnode]=minheap.top();
        minheap.pop();
        
        if(visited[curnode])continue;
        visited[curnode]=true;
        
        for(auto &[nextnode,nextweight]:g.adj[curnode])
        {
            int nextdist=curdist+nextweight;
            if(!visited[nextnode] && nextdist<dist[nextnode])
            {
                dist[nextnode]=nextdist;
                prev[nextnode]=curnode;
                minheap.push({nextdist,nextnode});
            }
        }
    }
    return dist;
}

int main() 
{
    int n, p,u,v,w,m;
    f>>n>>m;
    name g;
    g.init(n);
    for(int i=1; i<=m; i++)
    {
        f>>u>>v>>w;
        g.adj[u].push_back({v,w});
    }
    int sak= 1;
    auto dist = dijkstra(g,sak);
    for(int i=2; i<=n; i++)
        if(dist[i]==INT_MAX) fout<<0<<" ";
        else fout<<dist[i]<<" ";
}