Mai intai trebuie sa te autentifici.
Cod sursa(job #1837401)
Utilizator | Data | 29 decembrie 2016 17:19:27 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.52 kb |
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const int Inf = 0x3f3f3f3f;
using VI = vector<int>;
struct Pair{
int nod;
int dist;
bool operator < ( const Pair& p ) const
{
return dist > p.dist;
}
};
int N, M;
VI d;
vector<vector<Pair>> G;
void ReadGraph();
void Dijkstra( int nod, VI& d );
void Write();
int main()
{
ReadGraph();
Dijkstra(1, d);
Write();
fin.close();
fout.close();
return 0;
}
void ReadGraph()
{
int x, y, w;
fin >> N >> M;
G = vector<vector<Pair>>(N + 1);
d = VI(N + 1, Inf);
while ( M-- )
{
fin >> x >> y >> w;
G[x].push_back({y, w});
}
}
void Dijkstra( int nod, VI& d )
{
int i, j;
priority_queue<Pair> Q;
Pair p;
p.dist = 0, p.nod = nod;
Q.push(p);
d[nod] = 0;
while ( !Q.empty() )
{
int x = Q.top().nod;
int c = Q.top().dist;
Q.pop();
if ( c > d[x] )
continue;
for ( const auto& y : G[x] )
if ( d[y.nod] > c + y.dist )
{
d[y.nod] = c + y.dist;
p.dist = d[y.nod], p.nod = y.nod;
Q.push(p);
}
}
}
void Write()
{
int i;
for ( i = 2; i <= N; ++i )
if ( d[i] != Inf )
fout << d[i] << ' ';
else
fout << 0 << ' ';
}