You are on page 1of 5

Connecter the Campus

Muchos edificios nuevos se encuentran en construccin en el campus de la Universidad de Waterloo. La universidad


ha contratado albailes, electricistas, fontaneros, y un programador de computadoras. Un programador de
computadoras? S, usted ha sido contratado para asegurar que cada edificio est conectado a todos los dems
edificios (directa o indirectamente) a travs de la red del campus de cables de comunicacin.
Vamos a tratar a cada edificio como un punto especificado por una coordenada X y una coordenada. Cada cable de
comunicacin se conecta exactamente dos edificios, siguiendo una lnea recta entre los edificios. La informacin
viaja a lo largo de un cable en ambas direcciones. Los cables pueden cruzar libremente entre s, pero que slo se
conectan entre s en sus puntos finales (en edificios).
Se le ha dado un mapa del campus que muestra la ubicacin de todos los edificios y cables de comunicacin
existentes. Usted no debe alterar los cables existentes. Determinar dnde instalar nuevos cables de comunicacin
para que todos los edificios estn conectados. Por supuesto, la universidad a la que quiere minimizar la cantidad de
nuevo cable que utilice.

Solucin:
Este problema es un mnimo ligeramente modificado que atraviesa el problema de
rbol. Una primera tentativa es de usar el algoritmo de Kruskal que tiene como

notacin asinttic
(m log n). Sin embargo, el algoritmo de Kruskal requiere la
clasificacin y la averiguacin todos los Arcos posibles, y parece con el cual
tenemos tantos arcos para tratar. Cada dos nodos conducen a un arco en el peor

caso, entonces tenemos que mirar en la mayora

n
( 2)
n =
2

()

arcos. Pero la N mxima

es 750

(7502 )= 750 x2 749 375749=280277


Un nmero algo grande pero manejable. Entonces el algoritmo de Kruskal puede ser
un intento bueno

Ejecutando el cdigo podemos constatar los siguientes resultados de acuerdo a este


mtodo.
Conforme crece los puntos de Construccin el costo mnimo sera mucho ms
grande entre 2 vrtices de del grafo.

0.00

1.21

4.41

7.00

566.71

Costo Minimo
10
8
6
4
2
0

Costo Minimo

Como podemos constatar en el grafico podemos definir que el crecimiento del costo

mnimo al recorrer el grafo tiene como notacin asinttica


(m log n). Que
podemos decir que el crecimiento del grafico a medida que se va existiendo los
edificios de Construcciones. Crece de manera logartmica.
Codificacin:
#include
#include
#include
#include

<string.h>
<stdio.h>
<stdlib.h>
<cmath>

typedef struct Edge


{
int v1;
int v2;
double length;
}Edge;
int comp(const void *a,const void *b)
{
if (((Edge *)a)->length > ((Edge *)b)->length) return 1;
if (((Edge *)a)->length < ((Edge *)b)->length) return -1;
return 0;
}
int link[750];
int Find(int element)
{
if(link[element]==element)
return element;
else
return Find(link[element]);
}
void UnionSet(int set1, int set2)

{
link[set2]=set1;
}
void Union(int element1, int element2)
{
UnionSet(Find(element1),Find(element2));
}
void Kruskal(Edge *e,int nb,int ne,int nc)
{
int y;
double sum=0;
qsort(e,ne,sizeof(Edge),comp);
y=0;
while(nb>nc+1)
{
if(Find(e[y].v1)!=Find(e[y].v2))
{
sum+=e[y].length;
Union(e[y].v1,e[y].v2);
nb--;
}
y++;
}
printf("%.4lf\n",sum);
}
int main()
{
Edge e[30000];
int pos[750][2],NumB,NumC,NumE,y,z,t1,t2;
while(scanf("%d\n",&NumB)==1)
{
for(y=0;y<NumB;y++)
{
scanf("%d %d",&pos[y][0],&pos[y][1]);
link[y]=y;
}
scanf("%d",&NumC);
for(y=0;y<NumC;y++)
{
scanf("%d %d",&t1,&t2);
Union(t1-1,t2-1);
}
/* compute the distance */
NumE=0;
for(y=0;y<NumB;y++)
for(z=y+1;z<NumB;z++)
{
e[NumE].v1=y;
e[NumE].v2=z;
e[NumE++].length=sqrt((pos[y][0]-pos[z][0])*(pos[y][0]-pos[z][0])+(pos[y][1]-pos[z][1])*(pos[y]
[1]-pos[z][1]));

}
Kruskal(e,NumB,NumE,NumC);
}
return 0;
}

You might also like