Cod sursa(job #3296695)

Utilizator Benjamin4321234Benjamin Secara Benjamin4321234 Data 15 mai 2025 16:34:48
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
struct elem{
int catre,cost;
};

int n,m,x,y,z;
vector<elem> v[100001];
int dist_min[100001];

bool operator <(elem a, elem b){
    return a.cost>b.cost;
}

priority_queue<elem> q;

void dijkstra(int m){
    for(auto u:v[m]){
        q.push(u);
        ///punem nodurile care pleaca de la primul nod
        ///practic punem inceputurile
    }
    while(!q.empty()){
        elem x=q.top();
        q.pop();
        if(x.cost<dist_min[x.catre]){
            ///daca costul cu care am ajuns la nodul curent
            ///este mai mic decat costul curent al nodului
            ///il punem, si punem si vecinii lui
            dist_min[x.catre]=x.cost;
            for(auto u:v[x.catre]){
                elem nr;
                nr.cost=x.cost+u.cost;
            ///punem cu costul curent
                nr.catre=u.catre;
                q.push(nr);
            }
        }
    }
    for(int i=1;i<=n;i++){
        if(dist_min[i]!=100001){
            fout<<dist_min[i];
        }
        else{
            if(i==m){
                fout<<0;
            }
            else{
                fout<<-1;
            }
        }
        fout<<" ";
    }
}

int main()
{
    fin>>n>>m;
    while(fin>>x>>y>>z){
        elem nr;
        nr.catre=y;
        nr.cost=z;
        v[x].push_back(nr);
    }
    for(int i=1;i<=n;i++){
        if(i!=m){
            dist_min[i]=100001;
        }
    }

    dijkstra(m);


    return 0;
}