Pagini recente » Cod sursa (job #2688917) | Cod sursa (job #1438802) | Cod sursa (job #1810013) | Cod sursa (job #702625) | Cod sursa (job #1923092)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <list>
using namespace std;
# define INF 0x3f3f3f3f
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
typedef pair<int, int> iPair;
class Graph
{
int V;
list< pair<int, int> > *adj;
public:
Graph(int V);
void addEdge(int u, int v, int w);
void shortestPath(int s);
};
Graph::Graph(int V)
{
this->V = V;
adj = new list<iPair> [V + 1];
}
void Graph::addEdge(int u, int v, int w)
{
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
void Graph::shortestPath(int src)
{
priority_queue< iPair, vector <iPair> , greater<iPair> > pq;
vector<long> dist(V, INF);
pq.push(make_pair(0, src));
dist[src] = 0;
while (!pq.empty())
{
int u = pq.top().second;
pq.pop();
list< iPair >::iterator i;
for (i = adj[u].begin(); i != adj[u].end(); ++i)
{
int v = i->first;
int weight = i->second;
if (dist[v] > dist[u] + weight)
{
dist[v] = dist[u] + weight;
pq.push(make_pair(dist[v], v));
}
}
}
for (int i = 2; i < dist.size(); i++)
(dist[i] == INF) ? out << 0 << " " : out << dist[i] << " ";
}
int main()
{
int V, E;
in >> V >> E;
Graph g(V + 1);
for (int i = 0; i < E; i++)
{
int x, y, w;
in >> x >> y >> w;
g.addEdge(x, y, w);
}
in.close();
g.shortestPath(1);
out.close();
return 0;
}