Pagini recente » Cod sursa (job #601418) | Cod sursa (job #2795826) | Cod sursa (job #1696517) | Cod sursa (job #646489) | Cod sursa (job #1792365)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define infinit 2000000
#define min(a, b) ((a<b)? a: b)
using namespace std;
struct _arc{
int cost, destinatie;
} arc;
struct nod{
vector<_arc> v;
}v[500001];
bool cmp(_arc a1, _arc a2){
return (a1.cost>a2.cost);
}
vector<_arc> h;
bool viz[500001]={false};
int sol[500001];
int main()
{
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int i, j, n, m, a, b, c;
f>>n>>m;
for(i=1; i<=n; i++)
sol[i] = infinit;
for(i=1; i<=m; i++){
f>>a>>b>>c;
arc.destinatie = b;
arc.cost = c;
v[a].v.push_back(arc);
}
for(i=1; i<=n; i++)
sol[i] = infinit;
sol[1] = 0;
for(i=0; i< v[1].v.size(); i++){
h.push_back(v[1].v[i]);
sol[v[1].v[i].destinatie] = v[1].v[i].cost;
}
make_heap(h.begin(), h.end(), cmp);
while(!h.empty()){
arc = h.front();
pop_heap(h.begin(), h.end(), cmp);
h.pop_back();
if(arc.cost <= sol[arc.destinatie])
sol[arc.destinatie] = arc.cost;
for(i=0; i< v[arc.destinatie].v.size(); i++){
v[arc.destinatie].v[i].cost += arc.cost;
h.push_back(v[arc.destinatie].v[i]);
}
}
for(i=2; i<=n; i++)
g<<sol[i]<<" ";
}