Cod sursa(job #2097967)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 1 ianuarie 2018 22:48:54
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define inf 20005
#define maxn 50000

using namespace std;

vector <int> v[maxn]; /// vecini
vector <int> len[maxn]; /// lungime muchie
int cost[maxn]; /// cost minim
bool viz[maxn]; /// nod vizitat

bool found; /// am gasit un nod de vizitat

void visit ( int x )
{
  viz[x] = true;
  int nv = v[x].size ();

  for ( int j = 0; j < nv; j++ )
  {
    if ( cost[x] + len[x][j] < cost[ v[x][j] ] )
      cost[ v[x][j] ] = cost[x] + len[x][j];
  }
}

int find_node_to_visit ( int n )
{
  int _m = inf, p = -1;

  found = false;
  for ( int i = 0; i < n; i++ )
    if ( viz[i] == false && cost[i] < _m )
    {
      found = true;
      _m = cost[i];
      p = i;
    }

  return p;
}

int main ()
{
  ifstream fin ( "dijkstra.in" );
  ofstream fout ( "dijkstra.out" );

  int n, m;

  fin >> n >> m; /// noduri, arce

  int i, a, b, l;

  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> l;

    a--;
    b--;

    v[a].push_back ( b );
    len[a].push_back ( l );
  }

  for ( i = 1; i < n; i++ )
    cost[i] = inf;

  int x = find_node_to_visit( n );

  while ( found == true )
  {
    visit ( x );
    x = find_node_to_visit ( n );
  }

  for ( i = 1; i < n; i++ )
    if ( cost[i] < inf )
      fout << cost[i] << ' ';
    else
      fout << "0 ";

  fin.close ();
  fout.close ();

  return 0;
}