by jandujar » Tue Mar 09, 2004 11:16 pm
I recode this code
I have this code
[cpp]
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <math.h>
using namespace std;
/* Tipos */
struct EdgeOfGraph {
int vertex1,vertex2;
float weight;
};
typedef EdgeOfGraph edge;
typedef struct tipo{
float x;
float y;
}tipo;
typedef vector<tipo>punto;
/* Variables globales */
edge *edges,*edgesOfTree;
int v1,v2,nEdges,nVertices,*set;
punto puntos(101); //hay numero de puntos maximo de 100 el 0 no lo utilizo
int numeropuntos=0;
/* Make Set */
void Make_set(int set[])
{
int ctr1;
for(ctr1=1;ctr1<=set[0];ctr1++)
set[ctr1]=ctr1;
};
/* Link */
void Link(int set[],int x1,int x2)
{
int ctr1,ctr2,prevVal;
if(set[x1]==set[x2]) return ;
if(set[x1]<set[x2])
{prevVal=set[x2];
set[x2]=set[x1];
for(ctr1=1;ctr1<=set[0];ctr1++)
if(set[ctr1]==prevVal) set[ctr1]=set[x2];
return ;
}
if(set[x2]<set[x1])
{prevVal=set[x1];
set[x1]=set[x2];
for(ctr1=1;ctr1<=set[0];ctr1++)
if(set[ctr1]==prevVal) set[ctr1]=set[x1];
return ;
}
}
float distancia(float x1,float y1, float x2, float y2){
return ((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}
void get_Edges(){
int ctrl=1;
int vertice1=1;
int vertice2=2;
while (ctrl<=nEdges){
while (vertice2<=numeropuntos){
edges[ctrl].vertex1=vertice1;
edges[ctrl].vertex2=vertice2;
edges[ctrl].weight=distancia(puntos[vertice1].x,puntos[vertice1].y,puntos[vertice2].x,puntos[vertice2].y);
vertice2++;
ctrl++;
}
vertice1++;
vertice2=vertice1+1;
}
}
/* Sort Edges */
void sort_Edges(edge edges[])
{
int ctr1,ctr2,ctr3;
edge temp;
for(ctr1=2;ctr1<=nEdges;ctr1++)
{
temp=edges[ctr1];
ctr2=ctr1;
while(ctr2>1 && temp.weight<edges[ctr2-1].weight)
{edges[ctr2]=edges[ctr2-1];
ctr2--;
};
if(ctr2!=ctr1)
edges[ctr2]=temp;
}
}
/* Kruskal */
void implementKruskal(edge edges[],edge edgesOfTree[],int set[])
{int ctr1,ctr2=1;
for(ctr1=1;ctr1<=edges[0].vertex1;ctr1++)
{if(set[edges[ctr1].vertex1]!=set[edges[ctr1].vertex2])
{
Link(set,edges[ctr1].vertex1,edges[ctr1].vertex2);
edgesOfTree[ctr2++]=edges[ctr1];
};
}
edgesOfTree[0].vertex1=edgesOfTree[0].vertex2=edgesOfTree[0].weight=ctr2-1;
}
/* Recorremos los arcos sumando el resultado */
void muestraResultado(){
float salida=0;
int i;
for (i=1;i<=edgesOfTree[0].vertex1;i++){
salida+=sqrt(edges[i].weight);
}
printf("%.2lf\n",salida);
}
/* Ejecucion Kruskal */
int Kruskal(int nNodos)
{
set=(int *)malloc(sizeof(int) * (nNodos+1));
nEdges=nNodos*(nNodos -1)/2; //Maximo numero de nodos
edges=(edge *)malloc(sizeof(edge) * (nEdges+1));
edgesOfTree=(edge *)malloc(sizeof(edge) * (nEdges+1));
edges[0].vertex1=edges[0].vertex2=edges[0].weight=nEdges;
edgesOfTree[0].vertex1=edgesOfTree[0].vertex2=edgesOfTree[0].weight=nEdges;
// Carga las aristas
get_Edges();
// Ordena
sort_Edges(edges);
// Preparo el set
set[0]=nNodos;
Make_set(set);
// Ejecuto kruskal
implementKruskal(edges,edgesOfTree,set);
muestraResultado();
return 0;
}
/* A partir de aqui se acaba kruskal */
float distancia_minima(int indice){
float min=100000000;
float temp=100000000;
int i;
for(i=indice+1;i<numeropuntos;i++){
temp=distancia(puntos[indice].x,puntos[indice].y,puntos[i].x,puntos[i].y);
//cout<<"temp es:"<<temp<<endl;
if (temp<min){min=temp;}
}
return min;
}
int main(int argc, char *argv[])
{
int numerotest=0;
int i=0;
float x,y;
float salida=0;
// 200 es el tama
Last edited by
jandujar on Wed Mar 10, 2004 8:25 am, edited 1 time in total.