int main(){
	int i,j;
	scanf("%d %d", &n, &m);
	count = n;
	for(i=1; i<=m; i++){
		scanf("%d %d", &ex[i], &ey[i]);
		allowed[i] = 1;
	}
	scanf("%d", &q);
	for(i=0; i<q;i++){
		scanf("%d", &indexes[i]);
		allowed[indexes[i]] = 0;
	}
	for(i=1; i<=n; i++){
		p[i] = i;
		sz[i] = 0;
	}
	for(i=1;i<=m;i++){
		if(allowed[i])
			disj_union(ex[i], ey[i]);
	}

	j=1;
	ans[0] = count;
	for(i=q-1; i > 0; i--){
		disj_union(ex[indexes[i]], ey[indexes[i]]);
		ans[j++] = count;
	}

	for(i=q-1; i>0; i--)
		printf("%d ", ans[i]);
	printf("%d\n", ans[i]);
	return 0;
}
예제 #2
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;
}
예제 #3
0
/* 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;
}