Cod sursa(job #3219954)

Utilizator thinkphpAdrian Statescu thinkphp Data 1 aprilie 2024 20:30:00
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#include <vector>
#define oo ((1LL<<31)-1)
#define MAXN 50009
#define FIN "dijkstra.in"
#define FOUT "dijkstra.out"

using namespace std;

vector<int> V[MAXN];
vector<int> C[MAXN];
queue<int> Queue;
bitset<MAXN> inQueue(0);

int distMIN[MAXN];

int nodes,
    edges;

void readData() {

     int x,
         y,
         cost;

     freopen(FIN, "r", stdin);

     scanf("%d %d", &nodes, &edges);

     //printf("%d %d", nodes, edges);

     for(int ed = 1; ed <= edges; ed++) {

          scanf("%d %d %d",&x, &y,&cost);

          V[ x ].push_back( y );
          C[ x ].push_back( cost );
     }

     fclose( stdin );
}

void dijkstra() {

     for(int i = 2; i <= nodes; ++i) distMIN[ i ] = oo;

     distMIN[ 1 ] = 0;

     Queue.push( 1 );

     inQueue[ 1 ] = true;

     while(!Queue.empty()) {

          int curr = Queue.front();

          Queue.pop();

          inQueue[ curr ] = false;

          for(int i = 0; i < V[curr].size(); ++i) {

              int y = V[ curr ][ i ];

              int cost = C[ curr ][ i ];

              if(distMIN[ y ] > distMIN[ curr ] + cost) {

                 distMIN[ y ] = distMIN[ curr ] + cost;

                 if(!inQueue[ y ]) {

                     Queue.push( y );

                     inQueue[ y ] = true;
                 }
              }
          }
     }
}

void writeData() {


     freopen(FOUT, "w", stdout);

     for(int i = 2; i <= nodes; ++i)

        printf("%d ", (distMIN[ i ] < oo) ? distMIN[ i ] : 0);

    fclose(stdout);
}

int main(int argc, char const *argv[]) {

  readData();
  dijkstra();
  writeData();

  return 0;
}