Cod sursa(job #754490)

Utilizator rayvianPricope Razvan rayvian Data 2 iunie 2012 11:40:40
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <map>
using namespace std;

struct Node;
struct Muchie
{
  Node *start;
  Node *end;
  int cost;

  Muchie(Node *s,Node *e,int c):start(s),end(e),cost(c){}
  Muchie(){}
};

struct Node
{
  int ID;
  vector<Muchie *> neigh;
  Node(int i):ID(i){}
  Node(){}

};
const unsigned int INF = 150000000;

Node     *nodeMap[50002];
int mc = 0;
int dist[50002];
int viz[500002];
int noduri,muchii;

int det_min_neviz()
{
  int k = 0;
  int min = INF;

  for(int i = 2; i<=noduri; i++)
    if(dist[i] < min && viz[i] == 0)
    {
      min = dist[i];
      k = i;
    }
  return k;
}
int main()
{
  ifstream fin("dijkstra.in");
  ofstream fout("dijkstra.out");
  fin>>noduri>>muchii;

  for(int i = 0; i<muchii; i++)
  {
    int n1,n2,cost;
    fin>>n1>>n2>>cost;
    if(nodeMap[n1] == NULL)
      nodeMap[n1] = new Node(n1);
    if(nodeMap[n2] == NULL)
      nodeMap[n2] = new Node(n2);
    nodeMap[n1]->neigh.push_back(new Muchie(nodeMap[n1],nodeMap[n2],cost));
  }


  viz[1] = 1;
  
  for(int i = 2; i<=noduri; i++)
    dist[i] = INF;
  for(unsigned int i=0; i<nodeMap[1]->neigh.size(); i++)
  {
    int c = nodeMap[1]->neigh[i]->end->ID;
    dist[c] = nodeMap[1]->neigh[i]->cost;
  }

  int k;
  while(1)
  {
    k = det_min_neviz();
    if(k==0)
      break;
    viz[k] = 1;
    for(unsigned int i =0;i<nodeMap[k]->neigh.size(); i++)
      if(dist[nodeMap[k]->neigh[i]->end->ID] > dist[k] + nodeMap[k]->neigh[i]->cost)
        dist[nodeMap[k]->neigh[i]->end->ID] = dist[k] + nodeMap[k]->neigh[i]->cost;
  }


  for(int i = 2; i<=noduri; i++)
  {
    if(dist[i] < INF)
      fout<<dist[i]<<" ";
    else
      fout<<0<<" ";
  }

  return 0;
}