Pagini recente » Istoria paginii utilizator/milealoredana19 | lasm_28.11.2018 | Cod sursa (job #907320) | Istoria paginii runda/16_februarie_simulare_oji_2024_clasa_9 | Cod sursa (job #2224472)
#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;
}
int d[N];
struct info {
int nod;
};
bool operator<(info a,info b) {
if(d[a.nod]==d[b.nod]) {
return a.nod<b.nod;
}
return d[a.nod]<d[b.nod];
}
set<info>tsb;
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});
for(int i=2;i<=n;i++) {
d[i]=(1<<30);
tsb.insert({i});
}
while(!tsb.empty()) {
int nod=tsb.begin()->nod;
int dist=d[nod];
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]=dist+add;
tsb.insert({nou});
}
}
}
for(int i=2;i<=n;i++) {
if(d[i]==(1<<30)) {
fout<<"0 ";
}
else {
fout<<d[i]<<" ";
}
}
fout<<"\n";
return 0;
}