Sunteți pe pagina 1din 3

C:\Users\domen\Documents\Algoritmi e Strutture Dati\Miei Codici\COMPITI DA STAMPARE\21012015-1.

c venerdì 29 gennaio 2016 17:04


/*

Scrivere il codice di una funzione c che trovi il percorso di costo minimo


tra due città partendo da due grafi contenenti rispettivamente, in corrispondenza
degli archi, i costi del viaggio diretto per ferrovia e per via aerea tra due città.

*/
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
#include <time.h>
#include "pqueue.h"
#include "matrix.c"
#define DIM 5

ia
#define NC 100
#define NUMNODES (1 << DIM)

#define drand (((double) rand())/RAND_MAX)


//extern double **matalloc(int nrows, int ncols);

er
typedef struct {
int label;
double x, y;
} Point;

gn
typedef struct {
double **m, *potentials;
int numnodes, *path, patlen;
} Graph;

double distance(Point *a, Point *b) {


double d2 = 0, diff;
ge
diff = a->x - b->x;
d2 += diff * diff;
diff = a->y - b->y;
d2 += diff * diff;
return sqrt(d2);
In
}

void init(Graph *dij) {


int n;
double huge;

huge = NC;
re

dij->potentials[0] = 0.0;
dij->path[0] = -1;
for (n = 1; n < dij->numnodes; n++) {
dij->potentials[n] = huge;
dij->path[n] = -1;
}
ve

Point *getPoints(int numnodes) {


Point *points;
int i;
Vi

points = (Point *) calloc(numnodes, sizeof(Point));


for (i = 0; i < numnodes; i++) {
points[i].x = drand;
points[i].y = drand;
}
return points;
}

Graph getHCGraph(Point points[], int nn) {


Graph g;
int i, j, k;
double huge=NC;

-1-
C:\Users\domen\Documents\Algoritmi e Strutture Dati\Miei Codici\COMPITI DA STAMPARE\21012015-1.c venerdì 29 gennaio 2016 17:04

g.numnodes = 1 << nn;


g.m = matalloc(g.numnodes, g.numnodes);
g.potentials = (double *) calloc(g.numnodes, sizeof(double));
g.path = (int *) calloc(g.numnodes, sizeof(int));

for (i = 0; i < g.numnodes; i++)


for (j = 0; j < g.numnodes; j++)
g.m[i][j] = huge;

for (i = 0; i < g.numnodes; i++)


for (j = 0; j < nn; j++) {
k = i ^ (1 << j);
g.m[i][k] = distance(&points[i], &points[k]);

ia
}

init(&g);
return g;

er
}
/*
void dijkstraP(Graph *dij, int n) {
int k;
double cost;

gn
for (k = 0; k < dij->numnodes; k++) {
cost = dij->potentials[n] + dij->m[n][k];
if (cost < dij->potentials[k]) {
dij->potentials[k] = cost;
dij->path[k] = n;
printf("%d > %d (%3.2lf)\n", n, k, cost);
dijkstraP(dij, k);
ge
}
}

}*/
void dijkstraA(Graph *dij, int n) {
int k;
In
double cost;
PQNode *pq = NULL;

for (k = 0; k < dij->numnodes; k++) {


cost = dij->potentials[n] + dij->m[n][k];
if (cost < dij->potentials[k]) {
dij->potentials[k] = cost;
re

dij->path[k] = n;
pq = pushPQ(pq, k, cost);
}
}

while (pq != NULL) {


ve

pq = popPQ(pq, &k, &cost);


//printf("%d > %d (%3.2lf)\n", n, k, cost);
dijkstraP(dij, k);
}
Vi

double diajkstraPath(Graph *dij, int t) {


int i;

i = t;
printf("PATH: ");
while (i >= 0) {
printf("%d", i);
i = dij->path[i];
}
putchar('\n');
return dij->potentials[t];
-2-
C:\Users\domen\Documents\Algoritmi e Strutture Dati\Miei Codici\COMPITI DA STAMPARE\21012015-1.c venerdì 29 gennaio 2016 17:04

double dijkstraDouble(Graph *aereo,Graph *treno,int source,int dest){


dijkstraA(aereo,source);
dijkstraA(treno,source);
if(aereo->potentials[dest]<treno->potentials[dest])
return dijkstraPath(aereo,dest);
else
return dijkstraPath(treno,dest);

ia
er
gn
ge
In
re
ve
Vi

-3-

S-ar putea să vă placă și