Pagini recente » Cod sursa (job #2384138) | Cod sursa (job #447724) | Cod sursa (job #2073859) | Cod sursa (job #2740006) | Cod sursa (job #444713)
Cod sursa(job #444713)
# include <fstream>
# include <vector>
using namespace std;
const int maxn = 51000, inf = 2000000003;
int n, m;
vector <int> G [ maxn ], C [ maxn ];
int gSize [ maxn ], dist [ maxn ], from [ maxn ];
int heap [ maxn ], hSize;
int viz [ maxn ];
void build_graph (){
int i, x, y, c;
ifstream f ( "dijkstra.in" );
f >> n >> m;
for ( i = 0; i < m; ++ i ){
f >> x >> y >> c;
G [ x ] . push_back ( y );
C [ x ] . push_back ( c );
}
f . close ();
for ( i = 1; i <= n; ++ i )
gSize [ i ] = G [ i ] . size ();
}
int extract_min(){
int nd;
nd = heap [ 1 ];
heap [ 1 ] = heap [ hSize ];
-- hSize;
viz [ nd ] = 2;
return nd;
}
void downHeap ( int pos ){
int mn, md;
bool ok = true;
mn = pos;
md = dist [ heap [ mn ] ];
while ( ok ){
ok = false;
if ( pos * 2 <= hSize && dist [ heap [ pos * 2 ] ] < md ){
md = dist [ heap [ pos * 2 ] ];
mn = pos * 2;
}
if ( 1 + pos * 2 <= hSize && dist [ heap [ 1 + pos * 2 ] ] < md ){
md = dist [ heap [ 1 + pos * 2 ] ];
mn = 1 + pos * 2;
}
if ( mn != pos ){
swap ( heap [ pos ], heap [ mn ] );
ok = 1;
pos = mn;
}
}
}
void make_heap (){
int i;
for ( i = hSize/2; i > 0; -- i )
downHeap ( i );
}
void Dijkstra(){
int i, minim;
//init
for ( i = 2; i <= n; ++ i ){
dist [ i ] = inf;
//from [ i ] = -1;
}
dist [ 1 ] = 0;
//from [ 1 ] = 0;
heap [ 1 ] = 1;
hSize = 1;
//relax
while ( hSize > 0 ){
minim = extract_min (); // removes the minimum dist node nd and returns nd; also decreases hSize and makes viz [ nd ] == 2
for ( i = 0; i < gSize [ minim ]; ++ i )
if ( viz [ G [ minim ] [ i ] ] < 2 && dist [ minim ] + C [ minim ] [ i ] < dist [ G [ minim ] [ i ] ] ){
dist [ G [ minim ] [ i ] ] = dist [ minim ] + C [ minim ] [ i ];
//from [ G [ minim ] [ i ] ] = minim;
if ( ! viz [ G [ minim ] [ i ] ] ){
heap [ ++ hSize ] = G [ minim ] [ i ];
viz [ G [ minim ] [ i ] ] = 1;
}
}
make_heap ();
}
}
void afis (){
ofstream g ( "dijkstra.out" );
int i;
for ( i = 2; i <= n; ++ i )
if ( dist [ i ] != inf )
g << dist [ i ] << ' ';
else g << "0 ";
g << '\n';
g . close ();
}
int main (){
build_graph ();
Dijkstra ();
afis ();
return 0;
}