Pagini recente » Cod sursa (job #1496570) | Cod sursa (job #1265181) | Cod sursa (job #724989) | Cod sursa (job #1747819) | Cod sursa (job #1541044)
#include <iostream>
#include <cstdio>
#include <list>
#include <vector>
#include <set>
#define Inf ((1<<30)-1)
using namespace std;
struct Graph {
vector<list<pair<unsigned int, int> > > v;
};
Graph* readOrientedGraph() {
int n, m;
cin >> n >> m;
Graph *G = new Graph();
G->v.assign(n+1, *new list<pair<unsigned int, int> >());
unsigned int x, y;
int z;
for (int i = 0; i < m; i++) {
cin >> x >> y >> z;
G->v[x].push_back(make_pair(y, z));
}
return G;
}
Graph* readGraph() {
int n, m;
cin >> n >> m;
Graph *G = new Graph();
G->v.assign(n + 1, *new list<pair<unsigned int, int> >());
unsigned int x, y;
int z;
for (int i = 0; i < m; i++) {
cin >> x >> y >> z;
G->v[x].push_back(make_pair(y, z));
G->v[y].push_back(make_pair(x, z));
}
return G;
}
int *d;
void dijkstra(Graph *G, unsigned int startNode) {
set<pair<int, unsigned int> > st;
d = new int[G->v.size () + 1];
for (unsigned int i = 1; i <= G->v.size(); i++)
d[i] = Inf;
d[startNode] = 0;
st.insert(make_pair (0, startNode));
while (!st.empty()) {
unsigned int node = st.begin()->second;
for (list<pair<unsigned int, int> >::iterator it = G->v[node].begin (); it != G->v[node].end (); it++)
if (d[node] + it->second < d[it->first]) {
d[it->first] = d[node] + it->second;
//push
st.insert(make_pair (d[it->first], it->first));
}
//pop
st.erase(st.begin());
}
}
int main() {
freopen("dijkstra.in", "rt", stdin);
freopen("dijkstra.out", "wt", stdout);
unsigned int startingNode = 1;
Graph *G = readOrientedGraph();
dijkstra(G, startingNode);
for (unsigned int i = 1; i <= G->v.size () - 1; i++)
if (i != startingNode)
cout << d[i] << ' ';
return 0;
}