コード例 #1
0
//algorithm from course textbook
int kruskal(Matrix*result,DisjSets*dset,edge*ex,int len)
{
	int edgeOK=0,i=0,sum=0;
	edge * e =0;
	int v1,v2;
        qsort(ex,len,sizeof(edge), compare);// sorts edge by weights.
        i=0;
	while(edgeOK<(result->size)-1)
	{
		e=&ex[i++]; //selects minimum weighted edge.		
		v1=e->ea[0]; v2=e->ea[1];		
		int v1_eq = disj_find(dset,v1);
		int v2_eq = disj_find(dset,v2);
		if(v1_eq!=v2_eq)//checks their sets
		{
			edgeOK++;//accepted tree
			result->data[v1][v2]=1;//print in result matrix
			result->data[v2][v1]=1;
                        sum+=e->ea[2];  //adds weights to total
			disj_union(dset,v1_eq,v2_eq);//now they are in same set
		}
	}
        return sum;
}
コード例 #2
0
ファイル: connected.c プロジェクト: felipeblassioli/MAC0323
/* Retorna um inteiro cujo valor maximo eh points->size-1 */
int find_edges_shorter_than(float dist, plist *points)
{
  int edges;
  int r1,r2;
  lnk n,m; /* Cursores da lista de pontos */
  float weigth;
  dsets *dset;

  dset = malloc(sizeof *dset);
  init_dsets(dset,points->size);

  edges=0;
  for(n=points->head; n!=NULL; n=n->next)
    for(m=points->head; m!=NULL; m=m->next)
    {
      if(n == m) continue;
      weigth=distance(n->p,m->p);
      if(weigth<dist)
      {
        /*printf("x(%d-%d) weigth = %f dist = %f\n",n->index,m->index,weigth,dist);*/
        r1=disj_find(dset,n->index); 
        r2=disj_find(dset,m->index);
        if(r1!=r2)
        {
          /*printf("UNION r1=%d r2=%d weigth=%f\n",r1,r2,weigth);
          printPoint(n->p);
          printPoint(m->p);*/
          disj_union(dset,r1,r2);
          edges++;
          break;
        }
      }
    }
  free(dset);
  return edges;
}