Pagini recente » Cod sursa (job #2335921) | Cod sursa (job #3129797) | Cod sursa (job #1212591) | Cod sursa (job #628661) | Cod sursa (job #1457419)
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
#include <functional>
using namespace std;
struct cost{
int nod;
int c;
//cost cc;
};
struct info{
vector<cost> vecini;
int d;
bool in_heap;
};
int N, M;
vector <int> minHeap;
vector<info>tpl;
struct comparator{
bool operator()(int x, int y){
return tpl[x].d > tpl[y].d;
}
};
void Dijkstra(){
tpl[1].in_heap = true;
push_heap(minHeap.begin(), minHeap.end(), comparator());
while(!minHeap.empty()){
int u = minHeap.front();
tpl[u].in_heap = false;
pop_heap(minHeap.begin(), minHeap.end(), comparator());
minHeap.pop_back();
for(unsigned int i = 0; i < tpl[u].vecini.size(); ++i){
int v = tpl[u].vecini[i].nod;
if(tpl[v].in_heap == true && tpl[v].d > tpl[u].d + tpl[u].vecini[i].c){
tpl[v].d = tpl[u].d + tpl[u].vecini[i].c;
// minHeap.push_back(v);
// push_heap(minHeap.begin(), minHeap.end(), comparator());
// //tpl[v].in_heap = true;
}
}
}
}
int main(){
freopen("dijkstra.in", "rt", stdin);
freopen("dijkstra.out", "wt", stdout);
cin >> N >> M;
int x, y, c;
tpl.resize(N+1);
tpl[1].d = 0;
for(int i = 0; i < M; ++i){
cin >> x >> y >> c;
cost v;
v.nod = y;
v.c = c;
tpl[x].vecini.push_back(v);
if(x == 1) {
tpl[y].d = c;
}
else tpl[y].d = 1001;
if(y != 1){
minHeap.push_back(y);
tpl[y].in_heap = true;
}
}
Dijkstra();
for(int i = 2; i < N+1; ++i){
if(tpl[i].d == 1001) tpl[i].d = 0;
cout << tpl[i].d << " ";
}
//cout << "\n";
}