Cod sursa(job #1843658)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 9 ianuarie 2017 00:18:31
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
FILE *fin = fopen("dijkstra.in", "r");
FILE *fout = fopen("dijkstra.out", "w");

//Graf dens -> matrice de adiacență - cost[][]
//const int MAX_N = 1000;
//const int MAX_M = (MAX_N * (MAX_N + 1)) / 2;


//Graf rar -> liste de adiacență - vector<int>
const int MAX_N = 50000;
const int MAX_M = 500000;


const int INF = 0x7fffffff;
int N, M, u, v, c;

struct Muchie {
  int vecin;
  int cost;
};


struct Nod {
  int nod;
  int cost;


  bool operator < (const Nod &other) const {
    return this->cost > other.cost;
  }
};
vector<Muchie> vecini[1 + MAX_N];
bool vizitat[1 + MAX_N];
int cost[1 + MAX_N]; // adancime (in DFS si BFS)
int tata[1 + MAX_N]; // deUnde (pentru Dijkstra)
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 0; i < M; i++) {
    scanf("%d%d%d", &u, &v, &c);
    vecini[u].push_back(Muchie{v, c});
    vecini[v].push_back(Muchie{u, c});
  }
  int start = 1;
  // Dijkstra
  priority_queue<Nod> frontiera;
  for(int i = 0; i < N; i++) {
    cost[i] = INF;
  }
   frontiera.push({start,0});

   while (!frontiera.empty()) {
    Nod nodes = frontiera.top();
    int node = nodes.nod;
    frontiera.pop();
    if (!vizitat[node]) {
      vizitat[node] = true;
      for (Muchie m : vecini[node]) {
        if (cost[m.vecin] > cost[node] + m.cost) {
          frontiera.push(Nod{m.vecin, cost[m.vecin]});
              cost[m.vecin] = cost[node] + m.cost;
          tata[m.vecin] = node;
    }
      }
    }
  }
  for(int i=2;i<=N;i++) fprintf(fout,"%d ", cost[i]);
  return 0;
}