Pagini recente » Cod sursa (job #2722113) | Cod sursa (job #1011378) | Cod sursa (job #3311443) | Cod sursa (job #1554814) | Cod sursa (job #1571253)
#include <fstream>
#include <vector>
using namespace std ;
ifstream f ("dijkstra.in");
ofstream g ("dijkstra.out");
const int infinit = 2e9 ;
vector < pair < int , int > > G[50005] ;
int n , m ;
int cost[50005] ;
bool vizitat[50005] ;
void initilizare ()
{
f >> n >> m ; //nr de noduri si din ce nod se pleaca
int i , j , c ;
for ( ; m ; --m )
{
f >> i >> j >> c ;
G[i].push_back ( make_pair ( j , c ) ) ;
}
}
void dijkstra ( int sursa ) //sursa e nodul de inceput
{
for ( int i = 1 ; i <= n ; ++i )
cost[i] = infinit ; //initial costul e infinit
cost[sursa] = 0 ; //costul e 0 de la un nod la el insusi
for( int k = 1 ; k <= n ; ++k )
{
int minim = infinit , poz_min ;
for ( int i = 1 ; i <= n ; ++i ) //cautam nodul de cost minim
if ( !vizitat[i] && cost[i] < minim )
minim = cost[i] , poz_min = i ; //marcam pozitia nodului de cost minim
vizitat[poz_min] = 1 ; //marcam ca nodul vizitat
for ( vector < pair < int , int > > ::iterator it = G[poz_min].begin() ; it != G[poz_min].end() ; ++it )
{
pair < int , int > P = *it ;
if ( !vizitat[P.first] && cost[P.first] > cost[poz_min] + P.second )
cost[P.first] = cost[poz_min] + P.second ;
}
}
}
int main()
{
initilizare () ;
dijkstra ( 1 ) ; //facem pt nodul p
for ( int i = 2
; i <= n ; ++i )
if ( cost[i] != 2e9 ) //s-a imbunatatit deci s-a putut ajunge
g << cost[i] << " " ;
else
g << "0 " ; //nu se poate ajunge
}