Cod sursa(job #1571253)

Utilizator jurjstyleJurj Andrei jurjstyle Data 17 ianuarie 2016 17:13:58
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#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
}