Pagini recente » Monitorul de evaluare | Cod sursa (job #574192) | Cod sursa (job #3160714) | Cod sursa (job #698724) | Cod sursa (job #2224469)
#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;
}