All pastes #800918 Raw Edit

Dijkstran algoritmia mytilev sov

public cpp v1 · immutable
#800918 ·published 2007-11-28 21:03 UTC
rendered paste body
// Copyright Petri Kuukkanen joulukuu 2006#include <iostream>#include <vector>#include <cmath>struct Crossing{  float x, y;  // risteyksen koordinaatit};struct Road{  unsigned int begin, end; // risteykset, joiden välillä tie kulkee  float length;            // tien pituus};std::vector<Crossing> crossings; // kaupungin kaikki risteyksetstd::vector<Road> roads;         // kaupungin kaikki tiet// Lisää tietorakenteeseen uusi risteys.void addCrossing(float x, float y){  Crossing c;  c.x = x;  c.y = y;  crossings.push_back(c);}// Lisää tietorakenteeseen uusi tie.void addRoad(unsigned int begin, unsigned int end, float length){  Road r;  r.begin  = begin;  r.end    = end;  r.length = length;  roads.push_back(r);}// Palauta kahden risteyksen välinen linnuntietä pitkin mitattu etäisyys.float crossingsDistance(unsigned int c1, unsigned int c2){  float x1, y1, x2, y2;  x1 = crossings[c1].x;  y1 = crossings[c1].y;  x2 = crossings[c2].x;  y2 = crossings[c2].y;  return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));}// Etsi parhaat risteyksestä c alkavat reitit syvyyteen ensin -haulla.// Tämä on rekursiivinen (eli itseään kutsuva) funktio, jota kutsutaan// funktiosta findBestRoute.void findRoutes(unsigned int c, float l, int *R, float *L){  unsigned int e, r;  float f;  for(r = 0; r < roads.size(); r++)  {    if(roads[r].begin != c) continue;    e = roads[r].end;    f = l + roads[r].length;    if((R[e] == -1) || (L[e] > f))    {      R[e] = r;      L[e] = f;      findRoutes(e, f, R, L);    }  }}// Etsi paras reitti c:stä d:hen ja palauta reitin ensimmäisen tien numero.int findBestRoute(unsigned int c, unsigned int d){  if(c == d) return -1;  unsigned int i, j, k, N = crossings.size();  int   *R = new   int[N];  float *L = new float[N];  for(i = 0; i < N; i++) R[i] = -1;  findRoutes(c, 0, R, L);  j = R[d];  if(j != -1) while((k = roads[j].begin) != c) j = R[k];  delete[] R;  delete[] L;  return j;}int main(){  int i, j, k, N;  // Tee muutamia risteyksiä.  for(i = 0; i < 3; i++) for(j = 0; j < 3; j++) addCrossing(i, j);  N = crossings.size();  // Vector-luokan size-metodi palauttaa vektoriin                         // tallennettujen juttujen lukumäärän.  // Tee N kappaletta satunnaisia teitä.  for(i = 0; i < N; i++)  {    j = rand() % N;    k = rand() % N;    addRoad(j, k, crossingsDistance(j, k));  // menomatka j:stä k:hon    addRoad(k, j, crossingsDistance(k, j));  // paluumatka k:sta j:hin  }  // Näytä parhaat reitit.  for(i = 0; i < N; i++) for(j = 0; j < N; j++)  {    k = findBestRoute(i, j);    if(k != -1)    {      cout << i << " -> " << j;      cout << ": tie " << k << std::endl;    }  }  return 0;}