Pagini recente » Cod sursa (job #1520859) | Cod sursa (job #110725) | Cod sursa (job #2954267) | Cod sursa (job #1223762) | Cod sursa (job #1222523)
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
using namespace std;
int n, m, u, v, w;
vector< pair<int, int> > edges[250005]; // < v, cost>
vector < pair<int, int> > dist; // <nod, dist>
vector < int > so_far_dist;
struct comp{
bool operator()(const pair<int, int>& a, const pair<int, int>& b) const{
return a.second > b.second;
}
};
void dijkstra(){
while (dist.size()){
pair<int, int> p;
pop_heap(dist.begin(), dist.end()); p = dist.back(); dist.pop_back();
for (int i = 0; i < edges[p.first].size(); i++){
int x = edges[p.first][i].first;
if (p.second + edges[p.first][i].second < so_far_dist[x]){
so_far_dist[x] = p.second + edges[p.first][i].second;
dist.push_back(make_pair(x, so_far_dist[x]));
push_heap(dist.begin(), dist.end());
}
}
}
}
int main(){
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
scanf("%d%d", &n, &m);
//cin >> n >> m;
dist.push_back(make_pair(0, 0)), so_far_dist.push_back(0);
for (int i = 1; i < n; i++)
so_far_dist.push_back(1 << 30);
std::make_heap(dist.begin(), dist.end(), comp());
for (int i = 0; i < m; i++){
//cin >> u >> v >> w;
scanf("%d%d%d", &u, &v, &w);
u--, v--;
edges[u].push_back(make_pair(v, w));
}
dijkstra();
for (int i = 1; i < n; i++)
if (so_far_dist[i] == (1 << 30)) cout << 0 << " "; else cout << so_far_dist[i] << " ";
cout << "\n";
return 0;
}