Pagini recente » Denis S | Monitorul de evaluare | Rating Grigorescu Nicolae (Grigorescu_Nicolae_322CB) | Cod sursa (job #2893139) | Cod sursa (job #2646064)
#include <bits/stdc++.h>
#define PLI pair<long long, int>
#define INF 5000000001
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
int n, m, vf[250001], cost[250001], last[50001], urm[250001];
long long rez[50001];
priority_queue <PLI, vector<PLI>, greater<PLI>> q;
bitset <50001> viz;
int nr;
void adauga(int from, int to, int ct)
{
vf[++nr] = to;
cost[nr] = ct;
urm[nr] = last[from];
last[from] = nr;
}
int main()
{
in >> n >> m;
for(int i = 1, from, to, ct; i <= m; i++)
{
in>>from>>to>>ct;
adauga(from, to, ct);
}
for(int i = 2; i <= n; i++)
rez[i] = INF;
q.push({0,1});
while(!q.empty())
{
while( !q.empty() && viz[q.top().second] )
q.pop();
if(q.empty())
break;
int nod = q.top().second;
q.pop();
viz[nod] = 1;
for(int k = last[nod]; k != 0; k = urm[k])
{
int nod2 = vf[k];
long long ct = cost[k];
if( rez[nod]+ct < rez[nod2] )
{
rez[nod2] = rez[nod]+ct;
q.push({rez[nod2], nod2});
}
}
}
for( int i = 2; i <= n; i++ )
if(rez[i] == INF)
out << 0 << ' ';
else
out << rez[i] << ' ';
return 0;
}