Cod sursa(job #2224468)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 24 iulie 2018 09:08:10
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <set>

using namespace std;

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

const int N=50000+5;
int n,m;
struct road {
    int nod;
    int dist;
};
vector<road>v[N];

bool operator<(road a,road b) {
    if(a.dist==b.dist)
        return a.nod<b.nod;
    return a.dist>b.dist;
}
set<road>tsb;
int d[N];

int main() {
    fin>>n>>m;
    while(m--) {
        int a,b,d;
        fin>>a>>b>>d;
        v[a].push_back({b,d});
    }
    d[1]=0;
    tsb.insert({1,0});
    for(int i=2;i<=n;i++) {
        d[i]=(1<<30);
        tsb.insert({i,d[i]});
    }
    while(!tsb.empty()) {
        int nod=tsb.begin()->nod;
        int dist=tsb.begin()->dist;
        tsb.erase(tsb.begin());
        for(auto itr:v[nod]) {
            int nou=itr.nod;
            int add=itr.dist;
            if(dist+add<d[nou]) {
                tsb.erase({nou,d[nou]});
                d[nou]=dist+add;
                tsb.insert({nou,d[nou]});
            }
        }
    }
    for(int i=2;i<=n;i++) {
        if(d[i]==(1<<30)) {
            fout<<"0 ";
        }
        else {
            fout<<d[i]<<" ";
        }
    }
    fout<<"\n";
    return 0;
}