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; }
//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; }
/* 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; }