Pagini recente » Cod sursa (job #2840131) | Cod sursa (job #1446818) | Cod sursa (job #2928838) | Cod sursa (job #1700636) | Cod sursa (job #1007075)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout ("dijkstra.out");
const int Nmax = 50007;
const int Inf = (1<<30);
int N; int M;
vector < pair <int, int> > G[Nmax];
void Read() {
fin >> N >> M;
while(M--) {
int A, B, C;
fin >>A >> B >> C;
G[A].push_back(make_pair(B, C));
}
}
void Initialize(int MinDistance[], int S ) {
for(int i = 0 ;i <= N ; ++i) MinDistance[i] = Inf;
MinDistance[S] = 0;
}
int* Dijkstra(int Sursa) {
int MinDistance[Nmax];
priority_queue < pair <int, int> , vector < pair <int, int> >, greater < pair <int, int> > > Q;
Initialize(MinDistance, Sursa);
Q.push( make_pair(0 , 1));
while( !Q.empty()) {
int Node = Q.top().second;
int C = Q.top().first;
Q.pop();
for(int i = 0 ; i < G[Node].size(); ++i) {
if(MinDistance[G[Node][i].first] > C + G[Node][i].second) {
MinDistance[G[Node][i].first] = C + G[Node][i].second;
Q.push(make_pair(MinDistance[G[Node][i].first], G[Node][i].first) );
}
}
}
return MinDistance;
}
void Write(int Distance[]) {
for(int i = 2; i <= N; ++i)
if(Distance[i] == Inf)
fout << 0 << " ";
else fout << Distance[i] << " ";
}
int main() {
Read(); Write(Dijkstra(1));
fin.close();
return 0;
}