Pagini recente » Cod sursa (job #1253579) | Cod sursa (job #1113720) | Cod sursa (job #1352610) | Cod sursa (job #103551) | Cod sursa (job #1888312)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAX = 50005;
const int INF = 1<<30;
typedef pair<int, int> pii;
class Graph{
int n;
vector<vector<pii>> l;
public:
Graph(int n){
this->n = n;
l.resize(n + 1);
}
int getN() {return n;}
int getNodeListSize(int node) {return l[node].size();}
int getEdgeNode(int node, int pos) {return l[node][pos].first;}
int getEdgeCost(int node, int pos) {return l[node][pos].second;}
void addEdge(int node1, int node2, int cost){
l[node1].push_back(make_pair(node2, cost));
}
};
struct compar{
bool operator() (pii a, pii b) {return a.second > b.second;}
};
vector<int> dijkstra(Graph* g, int s){
bool viz[g->getN() + 1];
vector<int> d;
d.resize(g->getN() + 1);
priority_queue<pii, vector<pii>, compar> q;
for(int i = 1; i <= g->getN(); ++i){
viz[i] = 0;
d[i] = INF;
}
d[s] = 0;
q.push(make_pair(s, d[s]));
while(!q.empty()){
int node = q.top().first;
q.pop();
if(viz[node])
continue;
viz[node] = 1;
for(int i = 0; i < g->getNodeListSize(node); ++i)
if(!viz[g->getEdgeNode(node, i)])
if(d[g->getEdgeNode(node, i)] > d[node] + g->getEdgeCost(node, i)){
d[g->getEdgeNode(node, i)] = d[node] + g->getEdgeCost(node, i);
q.push(make_pair(g->getEdgeNode(node, i), d[g->getEdgeNode(node, i)]));
}
}
return d;
}
int main(){
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int n, m, x, y, z;
cin >> n >> m;
Graph* g = new Graph(n);
for(int i = 0; i < m; ++i){
cin >> x >> y >> z;
g->addEdge(x, y, z);
}
vector<int> res = dijkstra(g, 1);
for(int i = 2; i <= g->getN(); ++i)
cout << (res[i] == INF ? 0 : res[i]) << " ";
cout << endl;
return 0;
}