Professional Documents
Culture Documents
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
n
( 2)
n =
2
()
es 750
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
<string.h>
<stdio.h>
<stdlib.h>
<cmath>
{
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;
}