Pagini recente » Cod sursa (job #447695) | Cod sursa (job #2699017) | Cod sursa (job #2504623) | Cod sursa (job #560462) | Cod sursa (job #2148073)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const int INF = 0x3f3f3f3f;
const int NMAX = 100002;
int main()
{
int n,m,p;
fin >> n >> m;
/// citim cele 'n' noduri care au 'm' muchii si casa 'p' a lui Vlad
vector<pair<int,int> > G[NMAX]; /// creem graful
for(int i = 1; i <= m; i++)
/// citim cele m muchii
{
int from,to,cost;
fin >> from >> to >> cost;
G[from].push_back(make_pair(cost,to));
}
int dist[NMAX]; /// creem vectorul cu distantele pana la casa lui Vlad
memset(dist, INF, sizeof dist); /// initializam distantele pe infinit
dist[1] = 0; /// distanta pana la casa lui Vlad este de 0
set<pair<int,int> > heap; ///creem heap-ul
heap.insert(make_pair(0,1)); /// primul element este casa lui Vlad
while(!heap.empty())
{
int d = heap.begin() ->first;
int node = heap.begin() ->second;
heap.erase(heap.begin());
/// dupa ce am extras datele primului element le stergem
vector<pair<int,int> >::iterator it;
for(it = G[node].begin(); it != G[node].end(); ++it)
{
int cost = it ->first;
int to = it ->second;
if(dist[to] > dist[node] + cost)
{
if(dist[to] != INF)
heap.erase(heap.find(make_pair(dist[to],to)));
///daca exista deja un drum minim pana la nodul 'to' il stergem pentru ca am gasit unul mai bun
dist[to] = dist[node] + cost;
heap.insert(make_pair(dist[to],to));
}
}
}
for(int i = 1; i <= n; i++)
if(dist[i] == INF)
dist[i] = 0;
for(int i = 2; i <= n; i++)
fout << dist[i] << " ";
return 0;
}