Pagini recente » Cod sursa (job #127571) | Cod sursa (job #1228916) | Cod sursa (job #2613699) | Cod sursa (job #571947) | Cod sursa (job #1480714)
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#define MAX 100005
#define INFINITY (1 << 30)
using namespace std;
vector <int> gr[MAX];
map<pair<int, int>, int> cst;
int dmin[MAX];
int viz[MAX], in_queue[MAX];
class mycomparison
{
public:
bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) const
{
return (lhs.second>rhs.second);
}
};
void dijkstra(int v[MAX], int n, int start) {
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> q;
for(int i = 1; i <= n; ++i){
v[i] = INFINITY;
viz[i] = in_queue[i] = 0;
}
v[start] = 0;
q.push(make_pair(start, 0));
viz[start] = in_queue[start] = 1;
while(!q.empty()) {
int node = q.top().first;
viz[node] = 1;
q.pop();
for(int i = 0; i < gr[node].size(); ++i){
if(!viz[gr[node][i]]){
int x = v[node] + cst[make_pair(node, gr[node][i])];
if(x < v[gr[node][i]]) {
v[gr[node][i]] = x;
if(!in_queue[gr[node][i]]){
q.push(make_pair(gr[node][i], x));
in_queue[gr[node][i]] = 1;
}
}
}
}
}
}
int main() {
int n, m, a, b, c, minn, res = 0;
cin >> n >> m;
for(int i = 0; i < m; ++i) {
cin >> a >> b >> c;
gr[a].push_back(b);
gr[b].push_back(a);
if(cst.find(make_pair(a, b)) != cst.end())
cst[make_pair(a, b)] = cst[make_pair(b, a)] = min(c, cst[make_pair(a, b)]);
else
cst[make_pair(a, b)] = cst[make_pair(b, a)] = c;
}
dijkstra(dmin, n, 1);
for(int i = 2; i <= n; ++i)
cout << dmin[i] << " ";
return 0;
}