Cod sursa(job #2200237)

Utilizator BarbumateiBarbu Matei Barbumatei Data 30 aprilie 2018 17:47:07
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 50000
#define INF ( NMAX - 1 ) * 20000
using namespace std;
vector < pair<int, int> > G[NMAX + 1];
int dist[NMAX + 1];
bool solved[NMAX + 1];

struct cmp {
  bool operator()( const int &a, const int &b ) {
    return dist[a] > dist[b];
  }
};
priority_queue < int, vector<int>, cmp > coada;

int main() {
  int n, m, i, j, y, cost, varf;
  FILE *fin, *fout;
  fin = fopen( "dijkstra.in", "r" );
  fout = fopen( "dijkstra.out", "w" ) ;
  fscanf( fin, "%d%d", &n, &m );
  while ( m-- ) {
    fscanf( fin, "%d%d%d", &i, &j, &cost );
    G[i].push_back( make_pair( j, cost ) );
  }

  int start = 1;
  for ( i = 1; i <= n; i++ )
    if ( i != start )
      dist[i] = INF;

  coada.push( start );
  while ( !coada.empty() ) {
    varf = coada.top();
    coada.pop();
    if ( solved[varf] == false ) {
      solved[varf] = true;
      for ( j = 0; j < G[varf].size(); j++ ) {
        y = G[varf][j].first;
        cost = G[varf][j].second;
        if ( dist[y] > dist[varf] + cost ) {
          dist[y] = dist[varf] + cost;
          coada.push( y );
        }
      }
    }
  }
  for ( i = 1; i <= n; i++ )
    if ( i != start ) {
      if ( dist[i] == INF )
        dist[i] = 0;
      fprintf( fout, "%d ", dist[i] );
    }
  fputc( '\n', fout );
  fclose( fin );
  fclose( fout );
  return 0;
}