Cod sursa(job #2200252)

Utilizator BarbumateiBarbu Matei Barbumatei Data 30 aprilie 2018 19:20:26
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 50000
#define INF ( NMAX - 1 ) * 20000
using namespace std;
typedef pair<int, int> ii;
vector < ii > G[NMAX + 1];
int dist[NMAX + 1];
bool solved[NMAX + 1];
priority_queue < ii, vector<ii>, greater<ii> > 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++ )
      dist[i] = INF;

  coada.push( ii( 0, start ) );
  dist[start] = 0;
  while ( !coada.empty() ) {
    varf = coada.top().second;
    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( ii( dist[y], 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;
}